gpt4 book ai didi

c# - Microsoft.Office.Interop.Excel 或 EPPlus 用于读取巨大(或不读取)的 Excel 文件

转载 作者:行者123 更新时间:2023-11-30 22:18:14 27 4
gpt4 key购买 nike

我编写了一段代码来从 Excel 文件中读取一列。我对此使用 Microsoft.Office.Interop.Excel,首先读取整个范围,然后写入 System.Array,然后我对 System.Array 值进行一些操作,最后将其转换为 List,因为我填充了一个 ListBox 元素。这是代码(只有相关部分):

private List<string> bd = new List<string>();
private static System.Array objRowAValues;

private List<string> bl = new List<string>();
private static System.Array objRowBValues;

private List<string> cm = new List<string>();
private static System.Array objRowCValues;

private List<string> pl = new List<string>();
private List<string> bdCleanList;
private static Microsoft.Office.Interop.Excel.Application appExcel;

Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
Excel.Range rngARowLast, rngBRowLast, rngCRowLast;

long lastACell, lastBCell, lastCCell, fullRow;

private void btnCargarExcel_Click(object sender, EventArgs e)
{
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
if (System.IO.File.Exists(openFileDialog1.FileName))
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Thread.Sleep(10000);

filePath.Text = openFileDialog1.FileName.ToString();

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

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;

foreach (object elem in objRowAValues)
{
if (elem != "")
{
bd.Add(cleanString(elem.ToString(), 10));
}
}

nrosProcesados.Text = bd.Count().ToString();
listBox1.DataSource = bd;

xlWorkBook.Close(true, null, null);
xlApp.Quit();

releaseObject(xlWorkSheet);
releaseObject(xlWorkBook);
releaseObject(xlApp);

stopWatch.Stop();

TimeSpan ts = stopWatch.Elapsed;
executiontime.Text =
String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10).ToString();
}
else
{
MessageBox.Show("No se pudo abrir el fichero!");
System.Runtime.InteropServices.Marshal.ReleaseComObject(appExcel);
appExcel = null;
System.Windows.Forms.Application.Exit();
}
}
}

我使用包含约 800 000 个单元格的 Excel 文件进行测试,用时不到 2 分钟。然后我测试来自 EPPlus 的样本并且比我的方法更快所以我认为使用 EPPlus 而不是 Microsoft.Office.Interop.Excel 我认为也在使用 OpenXML SDK(但找不到任何例子来满足我的目标所以我离开现在)。在示例中,他们使用此代码读取 Excel 文件:

ExcelWorksheet sheet = package.Workbook.Worksheets[1];

var query1= (from cell in sheet.Cells["d:d"] where cell.Value is double && (double)cell.Value >= 9990 && (double)cell.Value <= 10000 select cell);

当然他们在这里使用 LINQ,但我关于这个主题的问题是:

  • 您使用的是哪种方法?
  • 您对此有何建议?
  • 对于使用 EPPlus 或 OpenXML SDK 编写相同内容有什么帮助吗?

我是 C# 世界的新手,来自 PHP 世界,这是我的第一个项目

最佳答案

您使用的是哪种方法?-EPPlus

您对此有何建议?-我发现 EPPLus 的速度要快得多。在我看来,它也是一个更容易使用的 API。出于多种原因,其中之一是缺乏 COM 互操作性(既为了速度又为了易用性)。要求也较低,尤其是在部署到服务器环境时:无需安装 Excel 垃圾。

使用 EPPlus 或 OpenXML SDK 编写相同内容有帮助吗?-EPPlus API 相当简单。尝试并发布更具体的问题,以及您目前已经尝试过的内容。

另一种遍历单元格的方法:

var firstColumnRows = sheet.Cells["A2:A"];

// Loop through rows in the first column, get values based on offset
foreach (var cell in firstColumnRows)
{
var column1CellValue = cell.GetValue<string>();
var neighborCellValue = cell.Offset(0, 1).GetValue<string>();
}

关于c# - Microsoft.Office.Interop.Excel 或 EPPlus 用于读取巨大(或不读取)的 Excel 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16221916/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com