Jak odczytać plik excel w C# bez użycia Microsoft.Biuro.Interop.Biblioteki Excela

Mam aplikację. Net-Windows w C#. Muszę otworzyć Excela i go przetworzyć. Jak mogę to zrobić bez korzystania z Microsoft.Biuro.Interop.Biblioteki Excela?

Author: Jeremy Thompson, 2012-02-06

11 answers

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);
    }
}
 38
Author: Aleksandar Vucetic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 05:04:19

Bardzo polecam CSharpJExcel do odczytu plików Excel 97-2003 (xls) i ExcelPackage do odczytu plików Excel 2007/2010 (Format Office Open XML, xlsx).

Oba działają idealnie. Nie mają absolutnie żadnej zależności od niczego.

Próbka za pomocą CSharpJExcel :

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

Próbka za pomocą 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 :

Jest inny projekt, ExcelDataReader, wydaje się, że ma możliwość obsługi obu formatów. Jest to również łatwe, jak inne, o których wspomniałem.

Istnieją również inne biblioteki:

 53
Author: Mohammad Dehghan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-17 08:01:50

Nalegałbym, aby nie używać OleDB, zwłaszcza jeśli będzie on uruchamiany na serwerze. Jego prawdopodobnie będzie kosztować więcej w dłuższej perspektywie - np mieliśmy zadanie SSIS wywołanie procedury składowanej z OLEDB czytania pliku excel w sptroc i nadal upaść pole SQL! Wyjąłem rzeczy OleDB ze sproc i przestało się to dziać na serwerze.

Lepszą metodą, jaką znalazłem, jest zrobienie tego z Office 2003 i plikami XML - w odniesieniu do rozważań dotyczących automatyzacji po stronie serwera Biuro . Uwaga: Office 2003 jest minimalnym wymogiem, aby móc latać:

Ref do odczytu z Excela: http://www.roelvanlisdonk.nl/?p=924 (proszę zrobić więcej badań, aby znaleźć inne przykłady)

Ref do pisania arkusza kalkulacyjnego 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);
        }
 2
Author: Jeremy Thompson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 04:58:01

Niedawno znalazłem tę bibliotekę, która konwertuje plik skoroszytu Excela do zbioru danych : Excel Data Reader

 2
Author: Hand-E-Food,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 05:01:09

Jeśli potrzebujesz otworzyć pliki XLS zamiast plików XLSX, http://npoi.codeplex.com to świetny wybór. Wykorzystaliśmy to do naszych projektów.

 2
Author: Pete McKinney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-28 20:07:31

Szukaj GSpread.NET. Jest to również projekt OpenSource i nie wymaga zainstalowanego pakietu Office. Możesz pracować z arkuszami kalkulacyjnymi Google za pomocą API z programu Microsoft Excel. Jeśli chcesz ponownie użyć starego kodu, aby uzyskać dostęp do arkuszy kalkulacyjnych Google, GSpread.NET to najlepszy sposób. Musisz dodać kilka wierszy:

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

Dalszy kod pozostaje bez zmian.

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

 2
Author: miro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-27 14:14:46

Możesz spróbować OleDB odczytać dane z pliku excel. Proszę spróbować jak następuje..

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
Author: Thit Lwin Oo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 04:50:16

Użyłem Excela.biblioteka dll , która jest:

  • open source
  • lightweight
  • fast
  • kompatybilny z xls i xlsx

Dokumentacja dostępna tutaj: https://exceldatareader.codeplex.com/

Zdecydowanie godny polecenia.

 1
Author: Kunal Kakkad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-18 07:17:25

Właśnie szukałem rozwiązania i natrafiłem na Spreadsheetlight

Który wygląda bardzo obiecująco. Jego open source i dostępny jako pakiet nuget.

 1
Author: Nick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-11 14:00:17

Jeśli nie chcesz używać interop, możesz wypróbować OfficeWriter . W zależności od tego, ile przetwarzania naprawdę musisz zrobić na pliku, może to być przesada. Możesz poprosić o bezpłatną wersję próbną. W pełni udokumentowane api jest dostępne na stronie documentation site.

DISCLAIMER: jestem jednym z inżynierów, którzy zbudowali najnowszą wersję.

 0
Author: Nick Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 15:46:34

Można też zrobić to, co ja i przez kontrolę komercyjną, taką jak ta: http://www.syncfusion.com/products/reporting-edition/xlsio

Jestem struganie od lat, zanim kończąc z komercyjnym rozwiązaniem. Najpierw wypróbowałem podejście OLEDB, które jest bardzo łatwe w użyciu w moim środowisku programistycznym, ale może być knightmare do wdrożenia. Następnie wypróbowałem rozwiązania open source, ale większość z nich jest przestarzała i ma złe wsparcie.

Kontrolki xlsio z syncfusion to tylko te, z których korzystam i z których jestem zadowolony, ale inne istnieją. Jeśli możesz to poruszyć, nie wahaj się, to najlepsze rozwiązanie. Dlaczego? Ponieważ nie ma zależności od systemu i obsługuje wszystkie wersje pakietu office od razu. Wśród innych zalet, takich jak, to naprawdę szybko.

I nie, nie pracuję dla synfusion;)

 0
Author: Jonx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-28 20:00:21