2015-10-23 128 views
12

我从.xlsx(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 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)); 
} 

但如果由于connectionString失败。所以,我更新了行支持的.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行。

同时我会尽量检查https://code.google.com/p/linqtoexcel/,但所有其他想法都非常值得欢迎!

编辑:只是检查了LinqToExcel,同样的问题如上:

的“Microsoft.ACE.OLEDB.12.0”供应商未注册的本地机器上。

EDIT2:归根结底,这似乎是这个解决方案解决了我的问题:

https://stackoverflow.com/a/19065266/3146582

+0

epplus https://epplus.codeplex.com/ – Fredou

+0

@Fredou:没有它创建电子表格?我需要从一个阅读。你有什么例子吗? –

+0

它也可以读取excel文件,检查这个stackoverflow问题http://stackoverflow.com/questions/11685204/reading-excel-spreasheet-using-epplus或这个博客条目http://blog.fryhard.com/archive/2010 /10/28/reading-xlsx-files-using-c-and-epplus.aspx – Fredou

回答

14

如果从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 your data 
    for (int rowNum = 1; rowNum <= totalRows; rowNum++) //selet 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)); 
    } 
} 
+0

谢谢!这对我来说是最好的解决方案。我只是改变了一下,并用foreach替换为追加到stringbuilder。 –

+0

@BlackHat很高兴帮助:) –

+1

EPPlus是GNU GPL v3许可。 – nyconing

-2

你这台机器上开发呢?如果不是,我会建议使用OpenXml SDK,你必须在开发者机器上使用install it

1

与OLE提供商阅读Excel文件是可能的,只有安装了MS Jet引擎(MS接入) 。我注意到你决定使用.NET interop来API,但这不是一个好主意:它需要安装MS Excel,并且不建议用于服务器上的自动化。

如果您不需要支持旧的(二进制)Excel格式(xls)并阅读XLSX就足够了,我推荐使用EPPlus库。它提供了简单而强大的API,用于读取和写入XLSX档案(并有大量的实例):

var existingFile = new FileInfo(filePath); 
// Open and read the XlSX file. 
using (var package = new ExcelPackage(existingFile)) { 
    // access worksheets, cells etc 
}