2012-02-06 286 views

回答

35
var fileName = @"C:\ExcelFile.xlsx"; 
var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\""; ; 
using (var conn = new OleDbConnection(connectionString)) 
{ 
    conn.Open(); 

    var sheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); 
    using (var cmd = conn.CreateCommand()) 
    { 
     cmd.CommandText = "SELECT * FROM [" + sheets.Rows[0]["TABLE_NAME"].ToString() + "] "; 

     var adapter = new OleDbDataAdapter(cmd); 
     var ds = new DataSet(); 
     adapter.Fill(ds); 
    } 
} 
+3

注意 - 当您的工作表受密码保护时,OLEDB不起作用。 – 2013-07-04 07:01:27

+0

谢谢,正是我在寻找 – Mana 2017-07-03 14:14:41

+0

@Aleksandar,这个解决方案是否也适用于Linux? – Dalton 2018-03-07 21:54:51

1

您可以尝试OleDB从Excel文件中读取数据。请尝试如下...

DataSet ds_Data = new DataSet(); 
OleDbConnection oleCon = new OleDbConnection(); 

string strExcelFile = @"C:\Test.xlsx"; 
oleCon.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strExcelFile + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\"";; 

string SpreadSheetName = ""; 

OleDbDataAdapter Adapter = new OleDbDataAdapter(); 
OleDbConnection conn = new OleDbConnection(sConnectionString); 

string strQuery; 
conn.Open(); 

int workSheetNumber = 0; 

DataTable ExcelSheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); 

SpreadSheetName = ExcelSheets.Rows[workSheetNumber]["TABLE_NAME"].ToString(); 

strQuery = "select * from [" + SpreadSheetName + "] "; 
OleDbCommand cmd = new OleDbCommand(strQuery, conn); 
Adapter.SelectCommand = cmd; 
DataSet dsExcel = new DataSet(); 
Adapter.Fill(dsExcel); 
conn.Close(); 
2

我会敦促使用OleDB,特别是如果它将在服务器上运行。从长远来看,它可能会让你付出更多的代价 - 例如,我们有一个SSIS工作调用了一个存储过程,OleDB读取了sptroc中的excel文件,并使SQL框崩溃!我把OleDB的东西拿出来了,它停止了服务器的崩溃。

我发现的一个更好的方法是使用Office 2003和XML文件 - 关于Considerations for server-side Automation of Office。注:Office 2003的是该飞行的最低要求:

参考从Excel中读取:http://www.roelvanlisdonk.nl/?p=924(请做更多的研究,以找到其他的例子)

参考写一个Excel电子表格:http://weblogs.asp.net/jgaylord/archive/2008/08/11/use-linq-to-xml-to-generate-excel-documents.aspx

public void ReadExcelCellTest() 
     { 
      XDocument document = XDocument.Load(@"C:\BDATA\Cars.xml"); 
      XNamespace workbookNameSpace = @"urn:schemas-microsoft-com:office:spreadsheet"; 

      // Get worksheet 
      var query = from w in document.Elements(workbookNameSpace + "Workbook").Elements(workbookNameSpace + "Worksheet") 
         where w.Attribute(workbookNameSpace + "Name").Value.Equals("Settings") 
         select w; 
      List<XElement> foundWoksheets = query.ToList<XElement>(); 
      if (foundWoksheets.Count() <= 0) { throw new ApplicationException("Worksheet Settings could not be found"); } 
      XElement worksheet = query.ToList<XElement>()[0]; 

      // Get the row for "Seat" 
      query = from d in worksheet.Elements(workbookNameSpace + "Table").Elements(workbookNameSpace + "Row").Elements(workbookNameSpace + "Cell").Elements(workbookNameSpace + "Data") 
        where d.Value.Equals("Seat") 
        select d; 
      List<XElement> foundData = query.ToList<XElement>(); 
      if (foundData.Count() <= 0) { throw new ApplicationException("Row 'Seat' could not be found"); } 
      XElement row = query.ToList<XElement>()[0].Parent.Parent; 

      // Get value cell of Etl_SPIImportLocation_ImportPath setting 
      XElement cell = row.Elements().ToList<XElement>()[1]; 

      // Get the value "Leon" 
      string cellValue = cell.Elements(workbookNameSpace + "Data").ToList<XElement>()[0].Value; 

      Console.WriteLine(cellValue); 
     } 
+1

这不是很多OleDB,这是对您的服务器的风险;它通过一个Stored Proc运行任何外部到SQL服务器,这是非常危险的。 – philu 2015-07-15 06:05:58

48

我强烈建议CSharpJExcel阅读的Excel 97-2003文件(XLS)和ExcelPackage读取的Excel 2007/2010文件(的Office Open XML格式,XLSX)。

他们都完美工作。他们完全不依赖任何东西。

使用CSharpJExcel样品:

Workbook workbook = Workbook.getWorkbook(new System.IO.FileInfo(fileName)); 
var sheet = workbook.getSheet(0); 
... 
var content = sheet.getCell(colIndex, rowIndex).getContents(); 
... 
workbook.close(); 

使用ExcelPackage样品:

using (ExcelPackage xlPackage = new ExcelPackage(existingFile)) 
{ 
    // get the first worksheet in the workbook 
    ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets[1]; 
    int iCol = 2; // the column to read 

    // output the data in column 2 
    for (int iRow = 1; iRow < 6; iRow++) 
    Console.WriteLine("Cell({0},{1}).Value={2}", iRow, iCol, 
     worksheet.Cell(iRow, iCol).Value); 

    // output the formula in row 6 
    Console.WriteLine("Cell({0},{1}).Formula={2}", 6, iCol, 
    worksheet.Cell(6, iCol).Formula); 

} // the using statement calls Dispose() which closes the package. 

编辑

还有另外一个项目,ExcelDataReader,似乎有能力来处理这两种格式。像我提到的其他人一样容易。

也有其他图书馆:

+2

这个ExcelDataReader真棒,比OLEDB快得多。 – 2016-02-29 02:12:54

+0

ExcelDataReader正在迁移到GitHub:https://github.com/ExcelDataReader/ExcelDataReader – 2017-05-16 07:30:56

0

如果你不想使用互操作,你可能想尝试OfficeWriter。根据你真正需要在文件上做多少处理,它可能会过度杀伤。您可以申请免费试用。在documentation site有一个完全记录的api。

免责声明:我是构建最新版本的工程师之一。

0

你也可以做我想做的,并通过这样的一个商业控制: http://www.syncfusion.com/products/reporting-edition/xlsio

我已经与商业解决方案在结束之前struging多年。我首先尝试了在我的开发环境中非常容易使用的OLEDB方法,但可以成为部署的骑士。然后我尝试了开源解决方案,但其中大部分已经过时并且支持不好。

来自syncfusion的xlsio控件只是我使用的,并且很满意,但其他人存在。如果你能够妥协,不要犹豫,这是最好的解决方案。为什么?因为它与系统没有依赖关系,并且支持所有版本的Office。除了其他优点之外,它非常快速。

不,我不为synfusion工作;)

2

如果您需要打开XLS文件,而不是XLSX文件,http://npoi.codeplex.com/是一个不错的选择。我们已经使用它来对我们的项目产生良好影响。

0

我刚一直在寻找一个解决方案,并遇到 Spreadsheetlight

这看起来非常有前途。它的开源代码可以作为nuget包使用。

2

寻找GSpread.NET。 这也是一个OpenSource项目,它不需要安装Office。 您可以使用Microsoft Excel中的API使用Google Spreadsheets。 如果您想重新使用旧代码来访问Google Spreadsheets,GSpread.NET是最好的方法。 您需要添加几行:

Set objExcel = CreateObject("GSpreadCOM.Application") 
// Name    - User name, any you like 
// ClientIdAndSecret - `client_id|client_secret` format 
// ScriptId   - Google Apps script ID 
app.MailLogon(Name, ClientIdAndSecret, ScriptId); 

其他代码保持不变。

http://scand.com/products/gspread/index.html

相关问题