簡體   English   中英

閱讀范圍由Microsoft.Office.Interop.Excel

[英]Reading range by Microsoft.Office.Interop.Excel

我想從Excel中讀取很多單元格到C#中的二維數組。 使用Microsoft.Office.Interop.Excel並逐個讀取單元格太慢了。 我知道如何將數組寫入范圍( Microsoft.Office.Interop.Excel真的很慢 ),但我想在相反的方向做

        _Excel.Application xlApp = new _Excel.Application();
        _Excel.Workbook xlWorkBook;
        _Excel.Worksheet xlWorkSheet;
        object misValue = System.Reflection.Missing.Value;
        xlWorkBook = xlApp.Workbooks.Open(path);

        xlWorkSheet = xlWorkBook.Worksheets["Engineering BOM"];


        _Excel.Range range = (_Excel.Range)xlWorkSheet.Cells[1, 1];
        range = range.get_Resize(13000, 9);


        string[,] indexMatrix = new string[13000, 9];

        // below code should be much faster

        for (int i = 1; i < 1300; i++)
        {
            for (int j = 1; j < 9; j++)
            {
                indexMatrix[i, j] = xlWorkSheet.Cells[i, j].Value2;
            }
        }

因此,我希望從數組中的單元格范圍中獲取值(范圍大小與數組大小完全相同)。 現在app正在逐個單元地讀取數據並將數據寫入數組但速度太慢。 有沒有辦法直接將整個范圍復制到單元格?

先感謝您 :)

你可以試試這個,它應該更快但是:

  • 您必須使用數據表 (在這種情況下,最好使用數據表而不是多維數組。)

  • 你不需要再關心范圍了

那我們該怎么辦? 連接到Excel並進行查詢以選擇所有數據並填充數據表。 我們需要的? 幾行代碼。

首先我們聲明我們的連接字符串:

對於Excel 2007或更高版本( *.XLSX文件)

string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=No;IMEX=1\";", fullPath);

對於Excel 2003*.XLS文件)

string connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\";", fullPath);

其中fullPath是excel文件的完整文件路徑


現在我們必須創建連接並填充數據表:

OleDbConnection SQLConn = new OleDbConnection(strConnectionString);
SQLConn.Open();
OleDbDataAdapter SQLAdapter = new OleDbDataAdapter();
string sql = "SELECT * FROM [" + sheetName + "$]";
OleDbCommand selectCMD = new OleDbCommand(sql, SQLConn);
SQLAdapter.SelectCommand = selectCMD;
SQLAdapter.Fill(dtXLS);
SQLConn.Close();

其中sheetName是您的工作表名稱, dtXLS是填充了所有Excel工作值​​的數據表。

這應該更快。

我想這個范圍在某種程度上定義了一個'數據表'。 如果這是正確的,那么最快就是使用OleDb或ODbc讀取數據(並且甚至不需要安裝excel):

DataTable tbl = new DataTable();
using (OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;" +
        $"Data Source={path};" +
        @"Extended Properties=""Excel 12.0;HDR=Yes"""))
using (OleDbCommand cmd = new OleDbCommand(@"Select * from [Engineering BOM$A1:i13000]", con))
{
    con.Open();
    tbl.Load(cmd.ExecuteReader());
}

如果不是,那么你可以這樣做:

Excel.Application xl = new Excel.Application();
var wb = xl.Workbooks.Open(path);

Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets["Engineering BOM"];

var v = ws.Range["A1:I13000"].Value;

(不確定excel本身是否可以進行如此大的數組分配)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM