【发布时间】:2017-04-13 03:42:52
【问题描述】:
假设你有一个包含一堆数字和行的 excel 文件,大约 100 行。
我想以编程方式编写一个带有公式的列,该公式将每个现有行的一组字段的值相加。
首先,当然,我会为 Excel 文件创建 Openfiledialog,找到路径,通过 OleDb 打开它。把这个记下来了。现在说我有下表:
[朋友 |钱 |金钱损失 |几天过去了|解决方案]
Bilbo , 50 , 50 , 7 , *公式在这里
Bilso , 80 , 50 , 7 , *公式在这里
等等……
问题是,我没有确切的行数,所以我必须枚举 OleDb 连接找到的任何内容。 该公式类似于 =(B2-C2)*D2 但 2 也是错误的,它必须与它所在的任何行相关,即:第 3 行将是 =(B3-C3)*D3。我不知道该怎么做。
我发现直接写入单元格也不会使公式直接处理数字。
=====
编辑:
private Excel.Application Xls;
private Excel.Workbooks WBs;
private Excel.Workbook WB;
private Excel.Worksheet WS;
private Excel.Sheets SS;
Excel.Range cellsRange = null;
Excel.Range columnRange = null;
Excel.Range rowRange = null;
int numberOfColumns = 0;
int numberOfRows = 0;
private void btnColumn_Click(object sender, EventArgs e)
{
if (btnColumn.FlatStyle == FlatStyle.Flat)
btnColumn.FlatStyle = FlatStyle.Standard;
else
{
btnColumn.FlatStyle = FlatStyle.Flat;
}
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Excel Files|*.xls;*.xlsx";
openFileDialog.ShowDialog();
string pather = openFileDialog.FileName;
if (pather == "" || pather == " " || pather == null)
{
return;
}
if (!string.IsNullOrEmpty(openFileDialog.FileName))
{
try
{
Xls = new Excel.Application();
WBs = Xls.Workbooks;
WB = WBs.Open(pather, 0, false, 5, "", "", true,
XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
SS = WB.Worksheets;
WS = SS.get_Item(1);
cellsRange = WS.Cells;
columnRange = cellsRange.Columns;
rowRange = cellsRange.Rows;
numberOfColumns = columnRange.Count;
numberOfRows = rowRange.Count;
int LastCell = numberOfColumns+1;
WS.Cells[1, LastCell] = "Tax Formula";
for (int i = 2; i < numberOfRows; i++)
{
//string niceFormula = "=SUM(L" + i + ",M" + i + ")*N"+ i ;
//WS.Cells[i, LastCell].Formula = niceFormula;
WS.Cells[i, LastCell].Value = (WS.Cells[i, 12] + WS.Cells[i, 13]) * WS.Cells[i, 14];
}
//==========================
WB.Save();
}
catch (Exception ex)
{
MessageBox.Show("Write Excel: " + ex.Message);
}
finally
{
GC.Collect();
GC.WaitForPendingFinalizers();
WB.Close();
Xls.Quit();
releaseObject(cellsRange);
releaseObject(columnRange);
releaseObject(rowRange);
releaseObject(SS);
releaseObject(WS);
releaseObject(WBs);
releaseObject(WB);
releaseObject(Xls);
}
MessageBox.Show("Finished Updating File", "Task complete");
}
}
有人知道为什么这段代码在尝试写入时会抛出以下错误吗?
HRESULT: 0x800A03EC
为了您的方便,重贴了整个代码。它仍在吐出 HRESULT 错误。
目标项目是 4 行深,1 行标题和大约 16 列宽。
【问题讨论】:
-
逐个处理每个单元格值会很慢。我建议您将 Excel 中的整个数据放入数据表中并进行计算(使用 LINQ 或常规循环)并将计算值添加到同一数据表中的新列中。最后将数据表以所需格式导出到 Excel 表中。
-
你没有告诉我们,你是怎么写到日期的。 VBA?还是具有 Excel 互操作性的 Winform 应用程序?还是带有 EPPlus 的 WinForm 应用程序?请详细说明。
-
@nabuchodonossor,我最初将其保持打开状态,因为有时有人会准备好 VBA 答案,但会被 C# 标签关闭。在某些情况下,我可以自己将逻辑转换为适合 C# 的逻辑,这样会有更多的总答案,但是是的,这是带有 Excel 互操作的 Winform。
-
@SouvikGhosh 好的,我想我现在如何将数据添加到数据表中,尽管我不确定如何做相反的事情(数据表到 excel)。但后来我不知道该怎么做。根本不是 LinQ 方面的专家,但我知道自己的编辑方法。
-
有大量的文章和答案将数据表导出到 excel。这是一个-stackoverflow.com/questions/8207869/…。我想你现在可以忽略 LINQ。只需在常规循环中进行计算并相应地更新数据表。
标签: c# winforms excel oledb vba