Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# 如何读取XLSX(Excel)?_C#_.net_Excel - Fatal编程技术网

C# 如何读取XLSX(Excel)?

C# 如何读取XLSX(Excel)?,c#,.net,excel,C#,.net,Excel,我在读取.xlsx(Excel)文件时遇到问题。我尝试使用: var fileName = @"C:\automated_testing\ProductsUploadTemplate-2015-10-22.xlsx"; var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", fileName); var ad

我在读取.xlsx(Excel)文件时遇到问题。我尝试使用:

var fileName = @"C:\automated_testing\ProductsUploadTemplate-2015-10-22.xlsx";
var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", fileName);

var adapter = new OleDbDataAdapter("SELECT * FROM [workSheetNameHere$]", connectionString);
var ds = new DataSet();
adapter.Fill(ds, "XLSData");
DataTable data = ds.Tables["XLSData"];

// ... Loop over all rows.
StringBuilder sb = new StringBuilder();
foreach (DataRow row in data.Rows)
{
    sb.AppendLine(string.Join(",", row.ItemArray));
}
但是如果由于
连接字符串
而失败。因此,我更新了该行以支持.xlsx:

var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 12.0;", fileName);
但我得到:

“Microsoft.ACE.OLEDB.12.0”提供程序未在本地计算机上注册

(这里的问题是,我无法在我的远程测试机上安装新软件,所以我无法修复它,需要找到其他解决方案。)

我还需要确保导入的数据将以某种简单的方式存储(我是初学者程序员),以使我能够遍历它,即使用行的数据创建对象

我检查的其他方法:

注释:似乎对我有用,但不支持未知维度的Excel文件(行和列的随机数)

注释:不支持与第一行不同的设置列名(在我的某些Excel文件中,第一行有4-6条注释,然后是标题行和下面的数据)

注释:与上述问题相同

评论:下载的软件包重量超过60MB,需要我在系统上安装,这在我的情况下是不可能的。不管怎样,人们评论说它被限制在150行之内

同时,我将尝试检查,但所有其他想法都非常欢迎

编辑:刚刚检查了LinqToExcel,与上面的问题相同:

“Microsoft.ACE.OLEDB.12.0”提供程序未在本地计算机上注册

EDIT2:最终,这个解决方案似乎解决了我的问题:


如果您正在从
Excel
文件读取数据,您可以使用
EPPlus
NuGet软件包,并使用以下代码:

//using OfficeOpenXml;
using (ExcelPackage xlPackage = new ExcelPackage(new FileInfo(@"C:\YourDirectory\sample.xlsx")))
{
    var myWorksheet = xlPackage.Workbook.Worksheets.First(); //select sheet here
    var totalRows = myWorksheet.Dimension.End.Row;
    var totalColumns = myWorksheet.Dimension.End.Column;

    var sb = new StringBuilder(); //this is your data
    for (int rowNum = 1; rowNum <= totalRows; rowNum++) //select starting row here
    {
        var row = myWorksheet.Cells[rowNum, 1, rowNum, totalColumns].Select(c => c.Value == null ? string.Empty : c.Value.ToString());
        sb.AppendLine(string.Join(",", row));
    }
}
//使用OfficeOpenXml;
使用(ExcelPackage xlPackage=new ExcelPackage(new FileInfo(@“C:\YourDirectory\sample.xlsx”))
{
var myWorksheet=xlPackage.工作簿.Worksheets.First();//在此处选择工作表
var totalRows=myWorksheet.Dimension.End.Row;
var totalColumns=myWorksheet.Dimension.End.Column;
var sb=new StringBuilder();//这是您的数据
for(int-rowNum=1;rowNum c.Value==null?string.Empty:c.Value.ToString());
sb.AppendLine(string.Join(“,”,row));
}
}

只有在安装了MS Jet engine(MS Access)的情况下,才能使用OLE提供程序读取Excel文件。我注意到您决定使用.NET interop to API,但这不是一个好主意:它需要安装MS Excel,不建议用于服务器上的自动化

若你们不需要支持旧的(二进制)Excel格式(xls),读XLSX就足够了,我建议你们使用这个库。它为读取和写入XLSX文件提供了简单而强大的API(并提供了许多示例):


epplus@Fredou:它不创建电子表格吗?我需要读一本书。你有这样的例子吗?它也可以读取excel文件,检查这个stackoverflow问题或这个博客条目@Fredou:现在我看到我也给出了那个链接。它可能会工作,但在使用xlsx文件之前,我确实需要知道我在xlsx文件中填充了多少个单元格,因为它不是逐行进行的,而是需要给出详细的单元格地址才能读取其值。可能是重复的,谢谢!这对我来说是最好的解决办法。我只是稍微修改了一下,用foreach替换了stringbuilder的附件。@BlackHat很高兴它有帮助:)EPPlus是GNU GPL v3授权的。
var existingFile = new FileInfo(filePath);
// Open and read the XlSX file.
using (var package = new ExcelPackage(existingFile)) {
   // access worksheets, cells etc
}