[英]Read a huge Excel column from C#
我有一個包含四列的Excel文檔(可能在2010年或2013年以后不知道是否會成為問題)。 前三列存儲電話號碼,該電話號碼基本上是包含10個或更多字符的字符串。 僅四列並將永遠存儲1、2、3或4,這是一個類別。 我需要檢查A列中的每個數字是否出現在B列和C列中,所以我認為在閱讀每列的所有Excel單元格並將其存儲在列表中(尚未實現,因為問題將在下面解釋) 。 為此,我編寫以下代碼:
private void btnCargarExcel_Click(object sender, EventArgs e)
{
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
if (System.IO.File.Exists(openFileDialog1.FileName))
{
filePath.Text = openFileDialog1.FileName.ToString();
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
Excel.Range range;
string str;
int rCnt = 0;
xlApp = new Microsoft.Office.Interop.Excel.Application();
xlWorkBook = xlApp.Workbooks.Open(openFileDialog1.FileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
range = xlWorkSheet.UsedRange;
for (rCnt = 1; rCnt <= range.Rows.Count; rCnt++)
{
str = (range.Cells[rCnt, 1] as Excel.Range).Value2.ToString();
//bd.Add(cleanString(str));
bd.Add(cleanString(str, 10));
}
for (rCnt = 1; rCnt <= range.Rows.Count; rCnt++)
{
str = (range.Cells[rCnt, 2] as Excel.Range).Value2.ToString();
//bd.Add(cleanString(str));
bl.Add(cleanString(str, 10));
}
for (rCnt = 1; rCnt <= range.Rows.Count; rCnt++)
{
str = (range.Cells[rCnt, 3] as Excel.Range).Value2.ToString();
//bd.Add(cleanString(str));
cm.Add(cleanString(str, 10));
}
nrosProcesados.Text = bd.Count().ToString();
listBox1.DataSource = bd;
noProcesadosBL.Text = bl.Count().ToString();
listBox2.DataSource = bl;
noProcesadosCM.Text = cm.Count().ToString();
listBox3.DataSource = cm;
xlWorkBook.Close(true, null, null);
xlApp.Quit();
releaseObject(xlWorkSheet);
releaseObject(xlWorkBook);
releaseObject(xlApp);
}
else
{
MessageBox.Show("No se pudo abrir el fichero!");
System.Runtime.InteropServices.Marshal.ReleaseComObject(appExcel);
appExcel = null;
System.Windows.Forms.Application.Exit();
}
}
}
因此,我對列中的槽單元進行了迭代,並在更改了一些字符串后將每個數字存儲在列表中,如您在代碼中所看到的。 這里的問題是,列A有797340個單元格,列B有91617個單元格,列C有95891個單元格,因此,如果我運行該應用程序,請加載Excel並等待我的PC掛出(即使具有12GB的RAM和Core i3處理器)我需要打開任務管理器並結束任務。 為了得到我想要的東西(只留下非重復的數字)而不掛出我的PC的最佳解決方案是什么? 在每個周期中,可以將事情划分為單獨的線程嗎(我對此不太了解,因為我是從C#開始的,所以會有所幫助)? 您對此主題有何看法?
編輯:添加一個新的和干凈的方法
因此,在閱讀和閱讀本文並獲得一些成員的幫助之后,我對代碼進行了一些改進,但現在又遇到了另一個問題(在代碼下方進行了注釋)。 現在查看代碼:
// this goes first when I declare vars
public static System.Array objRowAValues;
// this goes in action when I click the button (I leave only relevant part)
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
Excel.Range range, rngARowLast;
string str;
int rCnt = 0;
long lastACell, fullRow;
xlApp = new Microsoft.Office.Interop.Excel.Application();
xlWorkBook = xlApp.Workbooks.Open(openFileDialog1.FileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
xlWorkSheet = (Excel.Worksheet) xlWorkBook.Worksheets.get_Item(1);
range = xlWorkSheet.UsedRange;
fullRow = xlWorkSheet.Rows.Count;
lastACell = xlWorkSheet.Cells[fullRow, 1].End(Excel.XlDirection.xlUp).Row;
rngARowLast = xlWorkSheet.get_Range("A1", "A" + lastACell);
objRowAValues = (System.Array) rngARowLast.Cells.Value;
現在,因為我將使用objRowAValues中的值填充ListBox,並且ListBox僅接受List作為數據源,所以我需要將objRowAValues轉換為字符串列表。 我嘗試了一下,但對我沒有用。 有什么幫助嗎?
不幸的是,我更像是VB.NET的家伙-所以我已經為您轉換了一些代碼。 我希望它能開箱即用-我在這里不使用這種工具,因此我無法對其進行測試。
public void test()
{
object[,] RaWData = null;
dynamic range = xlWorkSheet.UsedRange;
//i am unsure here about the correct order - I do not work with excel at Work, so you might have to change the following lange, if columns needs to be before rows or so
RaWData = range.value2;
//I am using a list here, because Lists are a lot easier to work with then simple arrays
List<List<string>> RealData = new List<List<string>>();
//start at 1 because the excel-delivered array do not have values at index 0 - this is the only 1-based array you will ever encounter in .net
for (x = 1; x <= Information.UBound(RaWData, 1); x++) {
List<string> templist = new List<string>();
for (y = 1; y <= Information.UBound(RaWData, 2); y++) {
templist.Add(RaWData[x, y].ToString());
}
RealData.Add(templist);
}
//you should be finished here...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.