2009-03-18 12 views
58

Jak odczytać plik Excel za pomocą C#? Otwieram plik Excel do odczytu i kopiuję go do schowka, aby wyszukać format e-mail, ale nie wiem jak to zrobić.Jak odczytać dane z pliku Excel za pomocą C#?

FileInfo finfo; 
Excel.ApplicationClass ExcelObj = new Excel.ApplicationClass(); 
ExcelObj.Visible = false; 

Excel.Workbook theWorkbook; 
Excel.Worksheet worksheet; 

if (listView1.Items.Count > 0) 
{ 
    foreach (ListViewItem s in listView1.Items) 
    { 
     finfo = new FileInfo(s.Text); 
     if (finfo.Extension == ".xls" || finfo.Extension == ".xlsx" || finfo.Extension == ".xlt" || finfo.Extension == ".xlsm" || finfo.Extension == ".csv") 
     { 
      theWorkbook = ExcelObj.Workbooks.Open(s.Text, 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, false, false); 

      for (int count = 1; count <= theWorkbook.Sheets.Count; count++) 
      { 
       worksheet = (Excel.Worksheet)theWorkbook.Worksheets.get_Item(count); 
       worksheet.Activate(); 
       worksheet.Visible = false; 
       worksheet.UsedRange.Cells.Select(); 
      } 
     } 
    } 
} 
+0

Nowi użytkownicy pochodzące rozwiązania może chcieć, aby zobaczyć ten wątek [] (https://stackoverflow.com/questions/33302235/how-to-read-from-xlsx-excel). –

Odpowiedz

17

Dlaczego nie utworzyć OleDbConnection? Istnieje wiele dostępnych zasobów w Internecie. Oto przykład

OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+filename+";Extended Properties=Excel 8.0"); 
con.Open(); 
try 
{ 
    //Create Dataset and fill with imformation from the Excel Spreadsheet for easier reference 
    DataSet myDataSet = new DataSet(); 
    OleDbDataAdapter myCommand = new OleDbDataAdapter(" SELECT * FROM ["+listname+"$]" , con); 
    myCommand.Fill(myDataSet); 
    con.Close(); 
    richTextBox1.AppendText("\nDataSet Filled"); 

    //Travers through each row in the dataset 
    foreach (DataRow myDataRow in myDataSet.Tables[0].Rows) 
    { 
      //Stores info in Datarow into an array 
      Object[] cells = myDataRow.ItemArray; 
      //Traverse through each array and put into object cellContent as type Object 
      //Using Object as for some reason the Dataset reads some blank value which 
      //causes a hissy fit when trying to read. By using object I can convert to 
      //String at a later point. 
      foreach (object cellContent in cells) 
      { 
       //Convert object cellContect into String to read whilst replacing Line Breaks with a defined character 
       string cellText = cellContent.ToString(); 
       cellText = cellText.Replace("\n", "|"); 
       //Read the string and put into Array of characters chars 
       richTextBox1.AppendText("\n"+cellText); 
      } 
    } 
    //Thread.Sleep(15000); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.ToString()); 
    //Thread.Sleep(15000); 
} 
finally 
{ 
    con.Close(); 
} 
+7

Link jest już martwy –

+2

Jeden problem z OleDbConnection (przy użyciu adaptera danych Oracle) dotyczył kolumny zawierającej zarówno liczby, jak i tekst. Mam DataTable z kolumną sformatowaną jako numer, w którym brakowało wszystkich komórek, w których dane zostały sformatowane jako tekst. Moim rozwiązaniem było użycie funkcji interop do konwersji całego używanego zakresu kolumny do formatu TEXT przed użyciem OleDBC do pobrania danych. –

+0

Ostatnie działające archiwum [tutaj] (https://web.archive.org/web/20130731065653/http://blog.brezovsky.net/en-text-38.html). Tylko 40 wierszy ... prawdopodobnie można po prostu edytować post i dodać je. * Wzruszenie ramion * – Quantic

84

OK,

Jednym z trudniejszych pojęć uchwycić temat programowania Excel VSTO jest to, że nie odnoszą się do komórek jak tablica, Worksheet[0][0] nie da Ci komórki A1 , spowoduje to błąd na tobie. Nawet gdy wpiszesz w A1, gdy Excel jest otwarty, faktycznie wprowadzasz dane do Zasięgu A1. Dlatego odnosisz się do komórek jako nazwanych zakresów. Oto przykład:

Excel.Worksheet sheet = workbook.Sheets["Sheet1"] as Excel.Worksheet; 
Excel.Range range = sheet.get_Range("A1", Missing.Value) 

Teraz można dosłownie wpisać:

range.Text // this will give you the text the user sees 
range.Value2 // this will give you the actual value stored by Excel (without rounding) 

Jeśli chcesz zrobić coś takiego:

Excel.Range range = sheet.get_Range("A1:A5", Missing.Value) 

if (range1 != null) 
    foreach (Excel.Range r in range1) 
    { 
     string user = r.Text 
     string value = r.Value2 

    } 

może istnieć lepszy sposób, ale to nie ma pracował dla mnie.

Powodem trzeba użyć Value2 i nie Value dlatego, że nieruchomość Value jest sparametryzowanego i C# nie obsługuje ich jeszcze.

Jeśli chodzi o kod oczyszczający, opublikuję, że kiedy jutro przyjadę do pracy, nie mam kodu ze mną, ale jest to bardzo podstawowe. Po prostu zamykasz i zwalniasz obiekty w odwrotnej kolejności, w jakiej je stworzyłeś. Nie można użyć bloku Using(), ponieważ plik Excel.Application lub Excel.Workbook nie implementuje IDisposable, a jeśli nie zostanie wyczyszczony, pozostaną wiszące obiekty Excel w pamięci.

Uwaga:

  • Jeśli nie ustawić właściwość Visibility Excel nie wyświetla, które mogą być niepokojące dla użytkowników, ale jeśli chcesz po prostu zgrać dane na zewnątrz, to jest prawdopodobnie dobry wystarczy
  • Możesz też OleDb, to też zadziała.

Mam nadzieję, że zaczniesz, daj mi znać, jeśli potrzebujesz dalszych wyjaśnień. Będę pisać kompletny

tutaj jest kompletny próbki:

using System; 
using System.IO; 
using System.Reflection; 
using NUnit.Framework; 
using ExcelTools = Ms.Office; 
using Excel = Microsoft.Office.Interop.Excel; 

namespace Tests 
{ 
    [TestFixture] 
    public class ExcelSingle 
    { 
     [Test] 
     public void ProcessWorkbook() 
     { 
      string file = @"C:\Users\Chris\Desktop\TestSheet.xls"; 
      Console.WriteLine(file); 

      Excel.Application excel = null; 
      Excel.Workbook wkb = null; 

      try 
      { 
       excel = new Excel.Application(); 

       wkb = ExcelTools.OfficeUtil.OpenBook(excel, file); 

       Excel.Worksheet sheet = wkb.Sheets["Data"] as Excel.Worksheet; 

       Excel.Range range = null; 

       if (sheet != null) 
        range = sheet.get_Range("A1", Missing.Value); 

       string A1 = String.Empty; 

       if(range != null) 
        A1 = range.Text.ToString(); 

       Console.WriteLine("A1 value: {0}", A1); 

      } 
      catch(Exception ex) 
      { 
       //if you need to handle stuff 
       Console.WriteLine(ex.Message); 
      } 
      finally 
      { 
       if (wkb != null) 
        ExcelTools.OfficeUtil.ReleaseRCM(wkb); 

       if (excel != null) 
        ExcelTools.OfficeUtil.ReleaseRCM(excel); 
      } 
     } 
    } 
} 

wyślę funkcje z ExcelTools jutro, nie mam tego kodu ze mną albo.

Edytuj: Zgodnie z obietnicą, oto funkcje z narzędzi ExcelTools, których możesz potrzebować.

public static Excel.Workbook OpenBook(Excel.Application excelInstance, string fileName, bool readOnly, bool editable, 
     bool updateLinks) { 
     Excel.Workbook book = excelInstance.Workbooks.Open(
      fileName, updateLinks, readOnly, 
      Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
      Type.Missing, editable, Type.Missing, Type.Missing, Type.Missing, 
      Type.Missing, Type.Missing); 
     return book; 
    } 

public static void ReleaseRCM(object o) { 
     try { 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(o); 
     } catch { 
     } finally { 
      o = null; 
     } 
    } 

Mówiąc szczerze, te rzeczy są znacznie łatwiejsze, jeśli używasz VB.NET. Jest w języku C#, ponieważ go nie napisałem. VB.NET robi dobrze parametry opcji, C# nie, stąd Type.Missing. Po wpisaniu Wpisz.Tracę dwa razy z rzędu, uciekasz krzycząc z pokoju!

Jak Ci pytanie, można spróbować następujących czynności:

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range.find(VS.80).aspx

będę pisać przykład, kiedy wrócę z mojego spotkania ... Zdrówko

EDIT: Oto przykład

range = sheet.Cells.Find("Value to Find", 
               Type.Missing, 
               Type.Missing, 
               Type.Missing, 
               Type.Missing, 
               Excel.XlSearchDirection.xlNext, 
               Type.Missing, 
               Type.Missing, Type.Missing); 

range.Text; //give you the value found 

Oto kolejny przykład zainspirowane tym site:

range = sheet.Cells.Find("Value to find", Type.Missing, Type.Missing,Excel.XlLookAt.xlWhole,Excel.XlSearchOrder.xlByColumns,Excel.XlSearchDirection.xlNext,false, false, Type.Missing); 

Pomaga zrozumieć parametry.

P.S. Jestem jednym z tych dziwnych ludzi, którzy lubią uczyć się automatyzacji COM. Cały ten kod był na parze z narzędzia, które napisałem do pracy, co wymagało ode mnie przetworzenia ponad 1000 arkuszy kalkulacyjnych z laboratorium w każdy poniedziałek.

+0

Chcę przeczytać plik Excela z Listview do wyszukiwania adresu e-mailowego z pliku excel .... próbuję to zrobić ... ale ja nie znam typu kodowania programu Excel, mam na myśli formaty danych ... jak mogę odczytać plik Excela, aby wyszukać identyfikator e-mail ... Nie chcę korzystać z połączenia danych – ankush

+0

+1 doskonała odpowiedź głębi. właśnie straciłem całą nazwę/datę 400+ xls plików z odzyskanego dysku twardego, i to dostało mnie z powrotem na właściwe tory w h – Joe

+1

dlaczego linia deklaracji "używając ExcelTools = Ms.Office;" mówiąc "Nie można znaleźć nazwy typu lub przestrzeni nazw" Ms "? – Rishi

5

Przede wszystkim ważne jest, aby wiedzieć, co to znaczy „otworzyć plik programu Excel do czytania i skopiuj go do schowka ...”

Jest to bardzo ważne, ponieważ istnieje wiele sposobów można zrobić, że w zależności tylko o tym, co masz zamiar zrobić. Pozwól mi wyjaśnić:

  1. Jeśli chcesz przeczytać zbiór danych i skopiować, że w schowku i wiesz format danych (np nazwy kolumn), proponuję użyć OleDbConnection otworzyć plik w ten sposób możesz traktować zawartość pliku xls jako tabelę bazy danych, dzięki czemu możesz czytać dane za pomocą instrukcji SQL i traktować dane w dowolny sposób.

  2. Jeśli chcesz wykonywać operacje na danych za pomocą modelu obiektowego programu Excel, otwórz go w taki sposób, w jaki zacząłeś.

  3. Po pewnym czasie można potraktować plik xls jako rodzaj pliku csv, istnieją narzędzia, takie jak File Helpers, które pozwalają w prosty sposób traktować i otwierać plik xls, mapując strukturę na dowolnym obiekcie.

Innym ważnym punktem jest wersja programu Excel, w której znajduje się plik.

Mam, niestety, duże doświadczenie w pracy z automatyką Office na wszelkie sposoby, nawet jeśli ograniczam się takimi pojęciami, jak Automatyzacja aplikacji, Zarządzanie danymi i Wtyczki, i ogólnie sugeruję tylko w ostateczności korzystanie z automatyzacji Excela lub automatyzacja Office do odczytu danych; tylko jeśli nie ma lepszych sposobów na wykonanie tego zadania.

Praca z automatyzacją może być ciężka pod względem kosztów zasobów, może dotyczyć innych zagadnień związanych na przykład z bezpieczeństwem i więcej, i ostatnia, ale nie najmniej, współpraca z COM nie jest tak "darmowa". Moja sugestia to przemyśl i przeanalizuj sytuację w twoich potrzebach, a następnie podejmij lepszą decyzję.

20

Można użyć zestawu Microsoft.Office.Interop.Excel do przetwarzania plików programu Excel.

  1. Kliknij prawym przyciskiem myszy na projekcie i przejdź do Add reference. Dodaj Microsoft.Office.Interop.Montaż Excela.
  2. Dołącz using Microsoft.Office.Interop.Excel; do korzystania z zestawu.

Oto przykładowy kod:

using Microsoft.Office.Interop.Excel; 

    //create the Application object we can use in the member functions. 
    Microsoft.Office.Interop.Excel.Application _excelApp = new Microsoft.Office.Interop.Excel.Application(); 
    _excelApp.Visible = true; 

    string fileName = "C:\\sampleExcelFile.xlsx"; 

    //open the workbook 
    Workbook workbook = _excelApp.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, 
     Type.Missing, Type.Missing); 

    //select the first sheet   
    Worksheet worksheet = (Worksheet)workbook.Worksheets[1]; 

    //find the used range in worksheet 
    Range excelRange = worksheet.UsedRange; 

    //get an object array of all of the cells in the worksheet (their values) 
    object[,] valueArray = (object[,])excelRange.get_Value(
       XlRangeValueDataType.xlRangeValueDefault); 

    //access the cells 
    for (int row = 1; row <= worksheet.UsedRange.Rows.Count; ++row) 
    { 
     for (int col = 1; col <= worksheet.UsedRange.Columns.Count; ++col) 
     { 
      //access each cell 
      Debug.Print(valueArray[row, col].ToString()); 
     } 
    } 

    //clean up stuffs 
    workbook.Close(false, Type.Missing, Type.Missing); 
    Marshal.ReleaseComObject(workbook); 

    _excelApp.Quit(); 
    Marshal.FinalReleaseComObject(_excelApp); 
+0

Stwierdziłem, że następujące obiekty COM muszą być zadeklarowane, a następnie 'ReleaseComObject()' ed podczas 'clean up stuffs' lub też mam program excel zombie działający po zakończeniu kodu: Obiekt' Workbooks' utworzony na '_excelApp.Workbooks' , Obiekt 'Worksheets' utworzony na' workbook.Worksheets', 'Range' obiektach utworzonych w' worksheet.UsedRange.Rows' i 'worksheet.UsedRange.Columns' oraz obiekcie' excelRange'. Myślę również, że zastępuję dwa zastosowania 'worksheet.UsedRange' zmienną' excelRange' na wypadek, gdyby więcej obiektów COM zostało utworzonych z nieużywania istniejącej zmiennej. – Quantic

1

Zastosowanie OLEDB Podłączenie do komunikacji z plików Excel. daje lepszy wynik:

using System.Data.OleDb; 



       string physicalPath = "Your Excel file physical path"; 
       OleDbCommand cmd = new OleDbCommand(); 
       OleDbDataAdapter da = new OleDbDataAdapter(); 
       DataSet ds = new DataSet(); 
       String strNewPath = physicalPath; 
       String connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strNewPath + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\""; 
       String query = "SELECT * FROM [Sheet1$]"; // You can use any different queries to get the data from the excel sheet 
       OleDbConnection conn = new OleDbConnection(connString); 
       if (conn.State == ConnectionState.Closed) conn.Open(); 
       try 
       { 
        cmd = new OleDbCommand(query, conn); 
        da = new OleDbDataAdapter(cmd); 
        da.Fill(ds); 

       } 
       catch 
       { 
        // Exception Msg 

       } 
       finally 
       { 
        da.Dispose(); 
        conn.Close(); 
       } 

Dane wyjściowe będą przechowywane w zbiorze danych, przy użyciu obiektu zestawu danych, do którego można łatwo uzyskać dostęp do danych. Nadzieja to maja pomocny

+0

Występuje błąd w conn.Open(); etap. Sprawdzane z inną ścieżką ... – izbrannick

0

Excel File Reader & Writer Bez Excel Na u'r Systemu

  • Pobierz i dodać dll dla projektu NPOI u'r.
  • Używanie tego kodu do odczytu pliku Excela.

     using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
         { 
          XSSFWorkbook XSSFWorkbook = new XSSFWorkbook(file); 
         } 
         ISheet objxlWorkSheet = XSSFWorkbook.GetSheetAt(0); 
         int intRowCount = 1; 
         int intColumnCount = 0; 
         for (; ;) 
         { 
          IRow Row = objxlWorkSheet.GetRow(intRowCount); 
          if (Row != null) 
          { 
           ICell Cell = Row.GetCell(0); 
           ICell objCell = objxlWorkSheet.GetRow(intRowCount).GetCell(intColumnCount); }} 
    
-1
public void excelRead(string sheetName) 
     { 
      Excel.Application appExl = new Excel.Application(); 
      Excel.Workbook workbook = null; 
      try 
      { 
       string methodName = ""; 


       Excel.Worksheet NwSheet; 
       Excel.Range ShtRange; 

       //Opening Excel file(myData.xlsx) 
       appExl = new Excel.Application(); 


       workbook = appExl.Workbooks.Open(sheetName, Missing.Value, ReadOnly: false); 
       NwSheet = (Excel.Worksheet)workbook.Sheets.get_Item(1); 
       ShtRange = NwSheet.UsedRange; //gives the used cells in sheet 


       int rCnt1 = 0; 
       int cCnt1 = 0; 

       for (rCnt1 = 1; rCnt1 <= ShtRange.Rows.Count; rCnt1++) 
       { 
        for (cCnt1 = 1; cCnt1 <= ShtRange.Columns.Count; cCnt1++) 
        { 
         if (Convert.ToString(NwSheet.Cells[rCnt1, cCnt1].Value2) == "Y") 
         { 

          methodName = NwSheet.Cells[rCnt1, cCnt1 - 2].Value2; 
          Type metdType = this.GetType(); 
          MethodInfo mthInfo = metdType.GetMethod(methodName); 

          if (Convert.ToString(NwSheet.Cells[rCnt1, cCnt1 - 2].Value2) == "fn_AddNum" || Convert.ToString(NwSheet.Cells[rCnt1, cCnt1 - 2].Value2) == "fn_SubNum") 
          { 
           StaticVariable.intParam1 = Convert.ToInt32(NwSheet.Cells[rCnt1, cCnt1 + 3].Value2); 
           StaticVariable.intParam2 = Convert.ToInt32(NwSheet.Cells[rCnt1, cCnt1 + 4].Value2); 
           object[] mParam1 = new object[] { StaticVariable.intParam1, StaticVariable.intParam2 }; 
           object result = mthInfo.Invoke(this, mParam1); 
           StaticVariable.intOutParam1 = Convert.ToInt32(result); 
           NwSheet.Cells[rCnt1, cCnt1 + 5].Value2 = Convert.ToString(StaticVariable.intOutParam1) != "" ? Convert.ToString(StaticVariable.intOutParam1) : String.Empty; 
          } 

          else 
          { 
           object[] mParam = new object[] { }; 
           mthInfo.Invoke(this, mParam); 

           NwSheet.Cells[rCnt1, cCnt1 + 5].Value2 = StaticVariable.outParam1 != "" ? StaticVariable.outParam1 : String.Empty; 
           NwSheet.Cells[rCnt1, cCnt1 + 6].Value2 = StaticVariable.outParam2 != "" ? StaticVariable.outParam2 : String.Empty; 
          } 
          NwSheet.Cells[rCnt1, cCnt1 + 1].Value2 = StaticVariable.resultOut; 
          NwSheet.Cells[rCnt1, cCnt1 + 2].Value2 = StaticVariable.resultDescription; 
         } 

         else if (Convert.ToString(NwSheet.Cells[rCnt1, cCnt1].Value2) == "N") 
         { 
          MessageBox.Show("Result is No"); 
         } 
         else if (Convert.ToString(NwSheet.Cells[rCnt1, cCnt1].Value2) == "EOF") 
         { 
          MessageBox.Show("End of File"); 
         } 

        } 
       } 

       workbook.Save(); 
       workbook.Close(true, Missing.Value, Missing.Value); 
       appExl.Quit(); 
       System.Runtime.InteropServices.Marshal.FinalReleaseComObject(ShtRange); 
       System.Runtime.InteropServices.Marshal.FinalReleaseComObject(NwSheet); 
       System.Runtime.InteropServices.Marshal.FinalReleaseComObject(workbook); 
       System.Runtime.InteropServices.Marshal.FinalReleaseComObject(appExl); 
      } 
      catch (Exception) 
      { 
       workbook.Close(true, Missing.Value, Missing.Value); 
      } 
      finally 
      { 
       GC.Collect(); 
       GC.WaitForPendingFinalizers(); 
       System.Runtime.InteropServices.Marshal.CleanupUnusedObjectsInCurrentContext(); 
      } 
     } 

//code for reading excel data in datatable 
public void testExcel(string sheetName) 
     { 
      try 
      { 
       MessageBox.Show(sheetName); 

       foreach(Process p in Process.GetProcessesByName("EXCEL")) 
       { 
        p.Kill(); 
       } 
       //string fileName = "E:\\inputSheet"; 
       Excel.Application oXL; 
       Workbook oWB; 
       Worksheet oSheet; 
       Range oRng; 


       // creat a Application object 
       oXL = new Excel.Application(); 




       // get WorkBook object 
       oWB = oXL.Workbooks.Open(sheetName); 


       // get WorkSheet object 
       oSheet = (Microsoft.Office.Interop.Excel.Worksheet)oWB.Sheets[1]; 
       System.Data.DataTable dt = new System.Data.DataTable(); 
       //DataSet ds = new DataSet(); 
       //ds.Tables.Add(dt); 
       DataRow dr; 


       StringBuilder sb = new StringBuilder(); 
       int jValue = oSheet.UsedRange.Cells.Columns.Count; 
       int iValue = oSheet.UsedRange.Cells.Rows.Count; 


       // get data columns 
       for (int j = 1; j <= jValue; j++) 
       { 
        oRng = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[1, j]; 
        string strValue = oRng.Text.ToString(); 
        dt.Columns.Add(strValue, System.Type.GetType("System.String")); 
       } 


       //string colString = sb.ToString().Trim(); 
       //string[] colArray = colString.Split(':'); 


       // get data in cell 
       for (int i = 2; i <= iValue; i++) 
       { 
        dr = dt.NewRow(); 
        for (int j = 1; j <= jValue; j++) 
        { 
         oRng = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[i, j]; 
         string strValue = oRng.Text.ToString(); 
         dr[j - 1] = strValue; 


        } 
        dt.Rows.Add(dr); 
       } 
       if(StaticVariable.dtExcel != null) 
       { 
        StaticVariable.dtExcel.Clear(); 
        StaticVariable.dtExcel = dt.Copy(); 
       } 
       else 
       StaticVariable.dtExcel = dt.Copy(); 

       oWB.Close(true, Missing.Value, Missing.Value); 
       oXL.Quit(); 
       MessageBox.Show(sheetName); 

      } 

      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
      finally 
      { 

      } 
     } 

//code for class initialize 
public static void startTesting(TestContext context) 
     { 

      Playback.Initialize(); 
      ReadExcel myClassObj = new ReadExcel(); 
      string sheetName=""; 
      StreamReader sr = new StreamReader(@"E:\SaveSheetName.txt"); 
      sheetName = sr.ReadLine(); 
      sr.Close(); 
      myClassObj.excelRead(sheetName); 
      myClassObj.testExcel(sheetName); 
     } 

//code for test initalize 
public void runValidatonTest() 
     { 

      DataTable dtFinal = StaticVariable.dtExcel.Copy(); 
      for (int i = 0; i < dtFinal.Rows.Count; i++) 
      { 
       if (TestContext.TestName == dtFinal.Rows[i][2].ToString() && dtFinal.Rows[i][3].ToString() == "Y" && dtFinal.Rows[i][4].ToString() == "TRUE") 
       { 
        MessageBox.Show(TestContext.TestName); 
        MessageBox.Show(dtFinal.Rows[i][2].ToString()); 
        StaticVariable.runValidateResult = "true"; 
        break; 
       } 
      } 
      //StaticVariable.dtExcel = dtFinal.Copy(); 
     } 
4
try 
     { 
      DataTable sheet1 = new DataTable("Excel Sheet"); 
      OleDbConnectionStringBuilder csbuilder = new OleDbConnectionStringBuilder(); 
      csbuilder.Provider = "Microsoft.ACE.OLEDB.12.0"; 
      csbuilder.DataSource = fileLocation; 
      csbuilder.Add("Extended Properties", "Excel 12.0 Xml;HDR=YES"); 
      string selectSql = @"SELECT * FROM [Sheet1$]"; 
      using (OleDbConnection connection = new OleDbConnection(csbuilder.ConnectionString)) 
      using (OleDbDataAdapter adapter = new OleDbDataAdapter(selectSql, connection)) 
      { 
       connection.Open(); 
       adapter.Fill(sheet1); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 

Ten pracował dla mnie. Wypróbuj go i daj mi znać w przypadku zapytań.

+1

Twój kod działa idealnie dla mnie, bez instalowania żadnych bibliotek lub innych historii, dziękuję –

-2

Polecam, aby użyć arkusza kalkulacyjnego Bytescout.

https://bytescout.com/products/developer/spreadsheetsdk/bytescoutspreadsheetsdk.html

próbowałem go z MonoDevelop w Unity3D i to jest całkiem proste. Sprawdź ten przykładowy kod, aby zobaczyć, jak działa biblioteka:

https://bytescout.com/products/developer/spreadsheetsdk/read-write-excel.html

+0

Dziękujemy za rekomendację BajtScout Spreadsheet SDK, cieszę się, że działa dobrze dla ciebie w Monodevelop w Unity3D! Nie próbowaliśmy z Unity3D, ale prawdopodobnie powinniśmy teraz spróbować dodać go do listy próbek kodu źródłowego. –

+0

Nie ma za co! @EugeneM! Zawsze miło jest powiększyć listę rozwiązań, aby mieć więcej możliwości wyboru. – MetalxBeat

0

Korzystając Open XML.

Oto kod do przetwarzania arkusza kalkulacyjnego z określoną nazwą karty lub arkusza i zrzucania go do pliku CSV. (Wybrałem rurę zamiast przecinka).

Chciałbym, aby łatwiej było uzyskać wartość z komórki, ale myślę, że to jest to, z czym jesteśmy skazani. Widać, że odwołuję się do dokumentów MSDN, w których mam większość tego kodu. Właśnie to Microsoft zaleca.

/// <summary> 
    /// Got code from: https://msdn.microsoft.com/en-us/library/office/gg575571.aspx 
    /// </summary> 
    [Test] 
    public void WriteOutExcelFile() 
    { 
     var fileName = "ExcelFiles\\File_With_Many_Tabs.xlsx"; 
     var sheetName = "Submission Form"; // Existing tab name. 
     using (var document = SpreadsheetDocument.Open(fileName, isEditable: false)) 
     { 
      var workbookPart = document.WorkbookPart; 
      var sheet = workbookPart.Workbook.Descendants<Sheet>().FirstOrDefault(s => s.Name == sheetName); 
      var worksheetPart = (WorksheetPart)(workbookPart.GetPartById(sheet.Id)); 
      var sheetData = worksheetPart.Worksheet.Elements<SheetData>().First(); 

      foreach (var row in sheetData.Elements<Row>()) 
      { 
       foreach (var cell in row.Elements<Cell>()) 
       { 
        Console.Write("|" + GetCellValue(cell, workbookPart)); 
       } 
       Console.Write("\n"); 
      } 
     } 
    } 

    /// <summary> 
    /// Got code from: https://msdn.microsoft.com/en-us/library/office/hh298534.aspx 
    /// </summary> 
    /// <param name="cell"></param> 
    /// <param name="workbookPart"></param> 
    /// <returns></returns> 
    private string GetCellValue(Cell cell, WorkbookPart workbookPart) 
    { 
     if (cell == null) 
     { 
      return null; 
     } 

     var value = cell.CellFormula != null 
      ? cell.CellValue.InnerText 
      : cell.InnerText.Trim(); 

     // If the cell represents an integer number, you are done. 
     // For dates, this code returns the serialized value that 
     // represents the date. The code handles strings and 
     // Booleans individually. For shared strings, the code 
     // looks up the corresponding value in the shared string 
     // table. For Booleans, the code converts the value into 
     // the words TRUE or FALSE. 
     if (cell.DataType == null) 
     { 
      return value; 
     } 
     switch (cell.DataType.Value) 
     { 
      case CellValues.SharedString: 

       // For shared strings, look up the value in the 
       // shared strings table. 
       var stringTable = 
        workbookPart.GetPartsOfType<SharedStringTablePart>() 
         .FirstOrDefault(); 

       // If the shared string table is missing, something 
       // is wrong. Return the index that is in 
       // the cell. Otherwise, look up the correct text in 
       // the table. 
       if (stringTable != null) 
       { 
        value = 
         stringTable.SharedStringTable 
          .ElementAt(int.Parse(value)).InnerText; 
       } 
       break; 

      case CellValues.Boolean: 
       switch (value) 
       { 
        case "0": 
         value = "FALSE"; 
         break; 
        default: 
         value = "TRUE"; 
         break; 
       } 
       break; 
     } 
     return value; 
    } 
Powiązane problemy