如何在不使用 Microsoft.Office.Interop.Excel 库的情况下读取 C# 中的 excel 文件

本文关键字:情况下 读取 文件 excel 中的 Excel Interop Office Microsoft | 更新日期: 2023-09-27 18:22:45

我有一个 .C# 中的 Net-Windows 应用程序。我需要打开一个 excel 并处理它。如何在不使用 Microsoft.Office.Interop.Excel 库的情况下执行此操作?

如何在不使用 Microsoft.Office.Interop.Excel 库的情况下读取 C# 中的 excel 文件

我强烈推荐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:将Apache POI库移植到.NET:
    非常强大,免费和开源。除了Excel(97-2010(之外,它还支持Word和PowerPoint文件。

  • 卓越图书馆:
    它仅支持 Excel 97-2003 (xls( 文件。

  • EPPlus:
    ExcelPackage 的扩展。更容易使用(我猜(。

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,特别是如果它将在服务器上运行。从长远来看,它可能会花费您更多 - 例如,我们有一个 SSIS 作业调用存储过程,OleDB 在 sptroc 中读取 excel 文件并不断崩溃 SQL 框!我把OleDB的东西从sproc中取出来,它停止了服务器崩溃。

我发现的一个更好的方法是使用 Office 2003 和 XML 文件 - 关于 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);
        }

我最近发现了这个将 Excel 工作簿文件转换为数据集的库: Excel Data Reader

如果您需要打开XLS文件而不是XLSX文件,http://npoi.codeplex.com/是一个不错的选择。 我们已经在我们的项目中使用它取得了良好的效果。

查找 GSpread.NET。它也是一个开源项目,不需要安装Office。您可以使用 Microsoft Excel 中的 API 使用 Google 电子表格。如果您想重复使用旧代码来访问Google电子表格,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

您可以尝试使用 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();

我使用了Excel.dll库,它是:

  • 开源
  • 与 XLS 和 XLSX 兼容

此处提供的文档:https://exceldatareader.codeplex.com/

强烈推荐。

我只是在寻找解决方案并遇到了电子表格灯

这看起来很有前途。它的开源和作为 nuget 包提供。

如果您不想使用互操作,则可能需要尝试 OfficeWriter。根据您真正需要对文件执行多少处理,这可能是矫枉过正。您可以申请免费试用。文档站点上提供了一个完整记录的 API。

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

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

在以商业解决方案结束之前,我一直在挣扎多年。我首先尝试了 OLEDB 方法,它在我的开发环境中非常易于使用,但部署起来却是一场噩梦。然后我尝试了开源解决方案,但大多数都已经过时并且支持不佳。

来自syncfusion的xlsio控件只是我使用并且满意的控件,但其他控件存在。如果你能忍受它,不要犹豫,这是最好的解决方案。为什么?因为它与系统没有依赖关系,并且立即支持所有版本的 office。在其他优点中,它非常快。

不,我不为合成工作;)

对于需要的人,使用Interop.Excel打开Excel,而无需安装Office。您可以使用 nuget 添加 Interop.Excel。

public DataTable ReadExcel(string fileName)
    {
        Excel.Application FExcelObject = new Excel.Application();
        var FWorkbookObject = FExcelObject.Workbooks.Open(fileName,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing);
        //var sheets = FWorkbookObject.Sheets[1];
        foreach (Excel.Worksheet sheets in FWorkbookObject.Sheets)
        {
            System.Data.DataTable dt = new System.Data.DataTable(sheets.Name);
            DataRow dr;
            StringBuilder sb = new StringBuilder();
            int jValue = sheets.UsedRange.Cells.Columns.Count;
            int iValue = sheets.UsedRange.Cells.Rows.Count;
            for (int j = 1; j <= jValue; j++)
            {
                dt.Columns.Add("column" + j, System.Type.GetType("System.String"));
            }
            for (int i = 1; i <= iValue; i++)
            {
                dr = dt.NewRow();
                for (int j = 1; j <= jValue; j++)
                {
                    var oRng = (Microsoft.Office.Interop.Excel.Range)sheets.Cells[i, j];
                    string strValue = oRng.Text.ToString();
                    dr["column" + j] = strValue;
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }
        return new DataTable();
    }
}