我在C#中有一個.Net-Windows應用程序。我需要打開一個excel並處理它。如何在不使用Microsoft.Office.Interop.Excel庫的情況下執行此操作?如何在不使用Microsoft.Office.Interop.Excel庫的情況下讀取C#中的excel文件
回答
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);
}
}
您可以嘗試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();
我會敦促使用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);
}
這不是很多OleDB,這是對您的服務器的風險;它通過一個Stored Proc運行任何外部到SQL服務器,這是非常危險的。 – philu 2015-07-15 06:05:58
我最近發現這個庫的Excel工作簿文件轉換爲DataSet:Excel Data Reader
我強烈建議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,似乎有能力來處理這兩種格式。像我提到的其他人一樣容易。
也有其他圖書館:
NPOI: Port of the Apache POI library to .NET:
非常強大的,免費的,開源的。除Excel(97-2010)外,它還支持Word和PowerPoint文件。ExcelLibrary:
它只支持Excel 97-2003(xls)文件。EPPlus:
ExcelPackage的擴展。更容易使用(我猜)。
這個ExcelDataReader真棒,比OLEDB快得多。 – 2016-02-29 02:12:54
ExcelDataReader正在遷移到GitHub:https://github.com/ExcelDataReader/ExcelDataReader – 2017-05-16 07:30:56
如果你不想使用互操作,你可能想嘗試OfficeWriter。根據你真正需要在文件上做多少處理,它可能會過度殺傷。您可以申請免費試用。在documentation site有一個完全記錄的api。
免責聲明:我是構建最新版本的工程師之一。
你也可以做我想做的,並通過這樣的一個商業控制: http://www.syncfusion.com/products/reporting-edition/xlsio
我已經與商業解決方案在結束之前struging多年。我首先嚐試了在我的開發環境中非常容易使用的OLEDB方法,但可以成爲部署的騎士。然後我嘗試了開源解決方案,但其中大部分已經過時並且支持不好。
來自syncfusion的xlsio控件只是我使用的,並且很滿意,但其他人存在。如果你能夠妥協,不要猶豫,這是最好的解決方案。爲什麼?因爲它與系統沒有依賴關係,並且支持所有版本的Office。除了其他優點之外,它非常快速。
不,我不爲synfusion工作;)
如果您需要打開XLS文件,而不是XLSX文件,http://npoi.codeplex.com/是一個不錯的選擇。我們已經使用它來對我們的項目產生良好影響。
我剛一直在尋找一個解決方案,並遇到 Spreadsheetlight
這看起來非常有前途。它的開源代碼可以作爲nuget包使用。
尋找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);
其他代碼保持不變。
- 1. 如何在不使用javascript的情況下讀取excel文件
- 2. 在不使用jar文件的情況下讀取Excel文件
- 3. 如何在不使用ActiveXObject的情況下讀取javascript中的excel文件?
- 4. 如何在不使用ActiveX的情況下使用javascript讀取文本文件?
- 5. 如何在不鎖定的情況下讀取文本文件?
- 6. 如何在不使用任何Excel庫的情況下創建xlsx文件PHP
- 7. 如何在不使用boost庫的情況下讀取C++程序中的多個二進制文件
- 8. 如何在不使用第三方庫的情況下使用java在excel文件中管理excel表格
- 9. 如何在不讀取/寫入密鑰文件的情況下使用crypto ++?
- 10. 如何在不使用HttpEntity的情況下讀取?
- 11. 如何在不將文件保存到服務器的情況下從文件輸入中讀取excel文件
- 12. 在不使用Word的情況下閱讀C#中Word文件的內容
- 13. 如何在不鎖定的情況下打開Excel文件?
- 14. 從excel中使用Microsoft.Office.Interop.Excel讀取海量數據C#
- 15. 如何在C#中不使用Edmx的情況下使用DbContext?
- 16. 如何在不使用excel庫的情況下將宏插入到excel文件中
- 17. 如何在不下載的情況下讀取大型錯誤日誌文件?
- 18. 如何在不使用VBA的情況下獲取Excel中列值的數量?
- 19. 如何在不下載的情況下獲取文件屬性
- 20. 如何在不越獄的情況下閱讀iPhone文件?
- 21. 如何在不使用文件句柄的情況下獲取文件索引?
- 22. Node.js在不解壓的情況下讀取zip文件
- 23. BS4如何在不使用.text的情況下獲取文本?
- 24. 如何在不使用c#安裝Excel的情況下創建帶密碼保護的Excel 2003(.XLS)文件?
- 25. C#讀取Excel 2007 xlsm文件的庫?
- 26. 如何在不使用Excel的情況下運行宏
- 27. 在不使用OLEDB提供程序的情況下讀取Microsoft Excel數據?
- 28. 如何讀取C變量中的磁盤使用情況(du)
- 29. 如何在不隱藏C#的情況下打印Excel?
- 30. 如何在不使用任何外部庫的情況下壓縮文件?
注意 - 當您的工作表受密碼保護時,OLEDB不起作用。 – 2013-07-04 07:01:27
謝謝,正是我在尋找 – Mana 2017-07-03 14:14:41
@Aleksandar,這個解決方案是否也適用於Linux? – Dalton 2018-03-07 21:54:51