Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 打开Excel的最快方法_C#_Excel_Npoi - Fatal编程技术网

C# 打开Excel的最快方法

C# 打开Excel的最快方法,c#,excel,npoi,C#,Excel,Npoi,我一直在使用Microsoft.Office.Interop.Excel库打开Excel,刷新一些查询并保存。我遇到的问题是,只有当每台计算机都具有与安装在PC上的项目中选择的Excel库相同的Excel库时,这才有效 我知道NPOI可以将数据读写到Excel中,但是一个更简单的打开/刷新/保存任务,NPOI可以处理吗 如果使用这种语法,我似乎可以打开我的Excel文件,但是刷新查询和保存呢 using NPOI.HSSF.UserModel; using NPOI.SS.UserModel;

我一直在使用
Microsoft.Office.Interop.Excel
库打开Excel,刷新一些查询并保存。我遇到的问题是,只有当每台计算机都具有与安装在PC上的项目中选择的Excel库相同的Excel库时,这才有效

我知道NPOI可以将数据读写到Excel中,但是一个更简单的打开/刷新/保存任务,NPOI可以处理吗

如果使用这种语法,我似乎可以打开我的Excel文件,但是刷新查询和保存呢

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;

private void button1_Click(object sender, EventArgs e)
{
    HSSFWorkbook hssfwb;
    using (FileStream file = new FileStream(@"c:\test.xls", FileMode.Open, FileAccess.Read))
    {
      hssfwb= new HSSFWorkbook(file);
    }

通过“刷新查询”,我假设您的意思是Excel文件链接到某个数据源,并且您希望使用该数据源的当前数据更新Excel文件的内容

如果您希望它是“自动的”(也就是说,您不需要自己编写代码来进行更新),那么我认为Excel是唯一的方法。我很确定像NPOI(或EPPlus,或ClosedXML)这样的东西不会这样做。但是,如果您可以轻松地查询数据源,您可以自己使用这些库将值插入电子表格中

由于您讨论的是多台计算机,我假设您正在构建一个外接程序或一个部署到不同用户的EXE。在这种情况下,您可能希望根据受支持的最低版本的Excel进行构建。换句话说,您希望(比如)在开发机器上使用Excel2003或2007。(如果你能放弃对2003年的支持,你的生活会轻松得多)


如果您是基于Excel200x构建的,那么它在更高版本上应该可以正常运行。相反,情况并非如此。请注意,您不希望在开发机器上有多个版本

您也可以使用OLEDB适配器

System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " + excelfilepath+ "; Extended Properties = \"Excel 8.0;HDR=NO;IMEX=1\";"); /*for office 2007 connection*/
conn.Open();
   string strQuery = "SELECT * FROM [" + Table + "]";
   System.Data.OleDb.OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter(strQuery, conn);
 System.Data.DataTable ExcelToDataTable = new System.Data.DataTable();
 adapter.Fill(ExcelToDataTable);

我无法与NPOI交谈,但通过将COM互操作类型嵌入到程序集中,可以实现某些Office版本独立性。有关详细信息,请参阅。对于COM引用,一次只能安装一个引用。所以我一直无法找到一种方法来为2003年建造,并让它在2007年开放,反之亦然。因此,我研究了另一个.dll的可能性。是的,但是COM组件倾向于向后兼容,因此,如果您引用了1.x版,而用户使用了2.x版,它仍然可以工作。以我的经验,这是不可能的。例如,如果我使用MicrosoftExcel12.0对象库并像这样实例化Excel,如果用户没有安装Excel2007,每次都会出错语法。公共静态Excel。应用oXL;oXL=新的Excel.Application();可见=真;oXL.DisplayAlerts=false;oXL.AutomationSecurity=Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityLow;它应该会起作用。您如何部署您的EXE?您需要确保将生成时使用的Excel版本中的主互操作程序集复制到部署文件夹,而不是依赖GAC中较新版本的PIA。我使用的是windows窗体。但未确保将我的Excel版本中的PIA复制到部署文件夹中。我该怎么做呢?