2012-02-06 174 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

相關問題