it-swarm.com.de

So lesen Sie eine Excel-Datei in C # ohne Verwendung der Microsoft.Office.Interop.Excel-Bibliotheken

Ich habe eine .Net-Windows-Anwendung in C #. Ich muss ein Excel öffnen und verarbeiten. Wie kann ich dies tun, ohne Microsoft.Office.Interop.Excel-Bibliotheken zu verwenden?

42
ASD
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);
    }
}
40

Ich empfehle CSharpJExcel zum Lesen von Excel 97-2003-Dateien (xls) und ExcelPackage zum Lesen von Excel 2007/2010-Dateien (Office Open XML-Format, xlsx).

Sie arbeiten beide perfekt. Sie haben absolut keine Abhängigkeit von irgendetwas.

Beispiel mit CSharpJExcel :

Workbook workbook = Workbook.getWorkbook(new System.IO.FileInfo(fileName));
var sheet = workbook.getSheet(0);
...
var content = sheet.getCell(colIndex, rowIndex).getContents();
...
workbook.close();

Beispiel mit 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.

[~ # ~] edit [~ # ~] :

Es gibt ein anderes Projekt, ExcelDataReader , das anscheinend beide Formate verarbeiten kann. Es ist auch einfach wie die anderen, die ich erwähnt habe.

Es gibt auch andere Bibliotheken:

  • NPOI: Port der Apache-POI-Bibliothek zu .NET :
    Sehr leistungsfähig, kostenlos und Open Source. Neben Excel (97-2010) werden auch Word- und PowerPoint-Dateien unterstützt.

  • ExcelLibrary :
    Es werden nur Excel 97-2003-Dateien (xls) unterstützt.

  • EPPlus :
    Eine Erweiterung von ExcelPackage. Einfacher zu bedienen (denke ich).

56

Suchen Sie nach GSpread.NET. Es ist auch ein OpenSource-Projekt und erfordert keine Installation von Office. Sie können mit Google Spreadsheets mithilfe der API von Microsoft Excel arbeiten. Wenn Sie den alten Code wiederverwenden möchten, um Zugriff auf Google Spreadsheets zu erhalten, ist GSpread.NET der beste Weg. Sie müssen ein paar Zeilen hinzufügen:

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

Weiterer Code bleibt unverändert.

http://scand.com/products/gspread/index.html

2
miro

Wenn Sie XLS-Dateien anstelle von XLSX-Dateien öffnen müssen, ist http://npoi.codeplex.com/ eine gute Wahl. Wir haben es erfolgreich in unseren Projekten eingesetzt.

2
Pete McKinney

Ich würde dringend davon abraten, OleDB zu verwenden, insbesondere wenn es auf einem Server ausgeführt werden soll. Auf lange Sicht werden Sie wahrscheinlich mehr kosten - z. B. hatten wir einen SSIS-Job, der eine gespeicherte Prozedur aufrief, wobei die OleDB eine Excel-Datei im sptroc las und die SQL-Box immer wieder abstürzte! Ich habe das OleDB-Zeug aus dem Sproc genommen und es hat aufgehört, den Server zum Absturz zu bringen.

Eine bessere Methode, die ich gefunden habe, besteht darin, dies mit Office 2003 und den XML-Dateien zu tun - in Bezug auf Überlegungen zur serverseitigen Automatisierung von Office . Hinweis: Office 2003 ist eine Mindestanforderung zum Fliegen:

Siehe zum Lesen aus Excel: http://www.roelvanlisdonk.nl/?p=924 (bitte recherchieren Sie weiter andere Beispiele finden)

Siehe zum Schreiben einer Excel-Tabelle: 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);
        }
2
Jeremy Thompson

Ich habe kürzlich diese Bibliothek gefunden, die eine Excel-Arbeitsmappendatei in ein DataSet konvertiert: Excel Data Reader

2
Hand-E-Food

Sie können OleDB versuchen, Daten aus einer Excel-Datei zu lesen. Bitte versuchen Sie es wie folgt ..

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();
1
Thit Lwin Oo

Ich habe gerade nach einer Lösung gesucht und bin auf Spreadsheetlight gestoßen

das sieht sehr vielversprechend aus. Es ist Open Source und als Nuget-Paket erhältlich.

1
Nick

Ich habe Excel.dll Bibliothek verwendet, die ist:

  • Open Source
  • leicht
  • schnell
  • kompatibel mit xls und xlsx

Die Dokumentation finden Sie hier: https://exceldatareader.codeplex.com/

Sehr zu empfehlen.

1
Kunal Kakkad

Wenn Sie interop nicht verwenden möchten, können Sie OfficeWriter ausprobieren. Abhängig davon, wie viel Verarbeitung Sie tatsächlich für die Datei ausführen müssen, kann es jedoch zu einem Overkill kommen. Sie können eine kostenlose Testversion anfordern. Es gibt eine vollständig dokumentierte API auf der Dokumentationsseite .

HAFTUNGSAUSSCHLUSS: Ich bin einer der Ingenieure, die die neueste Version erstellt haben.

0
Nick Martin

Sie können auch das tun, was ich tue, und zwar mit einer kommerziellen Kontrolle wie dieser: http://www.syncfusion.com/products/reporting-edition/xlsio

Ich habe jahrelang gekämpft, bevor ich mit einer kommerziellen Lösung endete. Ich habe zuerst den OLEDB-Ansatz ausprobiert, der in meiner Entwicklungsumgebung sehr einfach zu verwenden ist, sich jedoch als Knightmare herausstellen lässt. Dann habe ich die Open Source-Lösungen ausprobiert, aber die meisten sind veraltet und haben schlechten Support.

Die xlsio-Steuerelemente von syncfusion sind genau die, die ich verwende und mit denen ich zufrieden bin, aber es gibt andere. Wenn Sie es mögen, zögern Sie nicht, es ist die beste Lösung. Warum? Weil es keine Abhängigkeiten zum System hat und alle Office-Versionen sofort unterstützt. Neben anderen Vorteilen ist es wirklich schnell.

Und nein, ich arbeite nicht für die Synfusion;)

0
Jonx