2014-09-12 69 views
4

我正在将xls和xlsx转换为c#中的数据表。我已经使用这个代码。将xls和xlsx转换为C#中的数据表#

public DataTable ReadDataExcel(string filepath) 
    { 
     FileStream stream = File.Open(filepath, FileMode.Open, FileAccess.Read); 
     IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream); 
     excelReader.IsFirstRowAsColumnNames = true; 
     DataSet result = excelReader.AsDataSet(); 
     DataTable dt = new DataTable(); 
     dt = result.Tables[0]; 
     return dt; 
    } 

在xls的情况下,它的工作正常。每当我使用xlsx它不工作。它给出'Object Reference'错误。

是否有任何其他方式将xls和xlsx转换为数据表。我不想使用 'Microsoft.Jet.OLEDB'....

+2

https://code.google.com/p/linqtoexcel/,HTTPS://closedxml.codeplex .com /,http://msdn.microsoft.com/en-us/library/bb448854%28office.14%29.aspx等我想象。 – David 2014-09-12 13:01:12

+0

感谢大卫的评论。我找到了答案,并在下面发布。 – RobinHood 2014-09-13 17:42:10

回答

3

这就是答案。

对于导入XLSX,

IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); 

对于导入XLS,

IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream); 
-2
public static DataTable MakeDataTablefromxls(string _path, string password = "") 
    { 
     DataTable dt = new DataTable(); 
     try 
     { 
      log.Info("MakeDataTablefromxls : Excel scraping started"); 
      xlsApp = new Microsoft.Office.Interop.Excel.Application(); 
      if (xlsApp == null) 
      { 
       return null; 
      } 
      wb = xlsApp.Workbooks.Open(_path, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true); 
      sheets = wb.Worksheets; 
      ws = (Excel.Worksheet)sheets.get_Item(1); 
      range = ws.UsedRange; 
      if (wb.ProtectStructure) 
      { 
       wb.Unprotect(password); 
      } 

      object[,] values = (object[,])range.Cells.Value; 

      //To Create columns of DataTable as per column range in xlxs sheet 
      for (int i = 1; i <= values.GetLength(1); i++) 
      { 
       dt.Columns.Add("F" + (i)); 
      } 

      //To Create rows of DataTable as per column range in xlxs sheet 
      for (int i = 2; i < values.GetLength(1); i++) 
      { 
       DataRow row = dt.NewRow(); 
       for (int j = 1; j < values.GetLength(1); j++) 
       { 
        row[j - 1] = values[i, j];// assigning Data from object array to data Datarow 
       } 
       dt.Rows.Add(row); 
      } 
      return dt; 
     } 
     catch (Exception ex) 
     { 
      log.Error("MakeDataTablefromxls : error : ", ex); 
      return null; 
     } 
     finally 
     { 
      wb.Close(false, System.Reflection.Missing.Value, System.Reflection.Missing.Value); 
      xlsApp.Quit(); 
      GC.Collect(); 
      if (range != null) Marshal.FinalReleaseComObject(range); 
      if (wb != null) Marshal.FinalReleaseComObject(wb); 
      if (sheets != null) Marshal.FinalReleaseComObject(sheets); 
      if (xlsApp != null) Marshal.FinalReleaseComObject(xlsApp); 
      GC.WaitForPendingFinalizers(); 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
      dt.Dispose(); 
      log.Info("MakeDataTablefromxls : Excel scraping completed"); 
     } 
    } 
相关问题