我在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. 如何在不使用ActiveXObject的情况下读取javascript中的excel文件?
- 3. 如何在不使用ActiveX的情况下使用javascript读取文本文件?
- 4. 如何在不锁定的情况下读取文本文件?
- 5. 如何在不使用任何Excel库的情况下创建xlsx文件PHP
- 6. 如何在不使用第三方库的情况下使用java在excel文件中管理excel表格
- 7. 如何在不读取/写入密钥文件的情况下使用crypto ++?
- 8. 如何在不使用HttpEntity的情况下读取?
- 9. 在不使用Word的情况下阅读C#中Word文件的内容
- 10. 如何在C#中不使用Edmx的情况下使用DbContext?
- 11. 如何在不使用excel库的情况下将宏插入到excel文件中
- 12. 如何在不越狱的情况下阅读iPhone文件?
- 13. Node.js在不解压的情况下读取zip文件
- 14. 如何在不使用文件句柄的情况下获取文件索引?
- 15. 在不使用OLEDB提供程序的情况下读取Microsoft Excel数据?
- 16. C#读取Excel 2007 xlsm文件的库?
- 17. 在不使用ODBC的情况下读取mdb(ms访问)文件
- 18. 如何在不使用MATLAB的情况下打开.mat文件?
- 19. 如何在不使用JSP中的scriptlet的情况下阅读附件消息?
- 20. 如何在不导致磁盘读取的情况下提供静态文件?
- 21. 如何写使用的Microsoft.Office.Interop.Excel Excel中的一个矩形内的文字,在c#
- 22. FileStream.Read - 在不使用循环的情况下读取流
- 23. 如何在不知道文件长度的情况下使用asyncSocket读取文件?
- 24. 如何在不使用makefile的情况下链接目标文件和库
- 25. 如何在不使用flash-activeX的情况下从* .Net中读取.flv文件的videoDuration?
- 26. 如何在不使用注册ocx文件的情况下在Visual C++中使用Flash文件?
- 27. 在不使用VB代码的情况下在Excel中排序
- 28. 如何在不用C#提出新请求的情况下读取当前的头文件?
- 29. 如何在不使用插件的情况下在WordPress中创建图库?
- 30. 如何在不安装的情况下使用数据库?
注意 - 当您的工作表受密码保护时,OLEDB不起作用。 – 2013-07-04 07:01:27
谢谢,正是我在寻找 – Mana 2017-07-03 14:14:41
@Aleksandar,这个解决方案是否也适用于Linux? – Dalton 2018-03-07 21:54:51