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

时间:2012-02-06 04:40:53

标签: c# .net excel office-interop

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

11 个答案:

答案 0 :(得分:56)

我强烈建议您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,它似乎能够处理这两种格式。它也像我提到的其他一样容易。

还有其他图书馆:

答案 1 :(得分:40)

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);
    }
}

答案 2 :(得分:2)

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

我发现的一个更好的方法是使用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);
        }

答案 3 :(得分:2)

我最近发现这个库将Excel工作簿文件转换为DataSetExcel Data Reader

答案 4 :(得分:2)

如果您需要打开XLS文件而不是XLSX文件,http://npoi.codeplex.com/是一个很好的选择。我们已经将它用于我们的项目。

答案 5 :(得分: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

答案 6 :(得分: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();

答案 7 :(得分:1)

我使用了 Excel.dll 库:

  • 开源
  • 轻质
  • 与xls和xlsx兼容

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

非常值得推荐。

答案 8 :(得分:1)

我一直在寻找解决方案并遇到过 Spreadsheetlight

看起来很有前途。它是开源的,可作为nuget包使用。

答案 9 :(得分:0)

如果您不想使用互操作,可能需要试用OfficeWriter。根据您真正需要对文件执行的处理量,可能会有些过度。您可以申请免费试用。 documentation site有一个完整记录的api。

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

答案 10 :(得分:0)

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

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

来自syncfusion的xlsio控件只是我使用的并且很满意但是其他存在。如果你可以吝啬,不要犹豫,这是最好的解决方案。为什么?因为它与系统没有依赖关系,并且立即支持所有版本的办公室。除了其他优点之外,它真的很快。

不,我不参与synfusion;)