【求助】关于C#操作Excel.Range单元格计算

linxiamaomao 2012-05-28 10:20:23
object Cell0 = Excel.WorkSheet[1, 7]
Excel.Range = (Excel.Range)Excel.WorkSheet.get_Range(Cell0, Cell0)
object Cell1 = Excel.WorkSheet[18, 7] =======> 列需要循环100次~例如 G,H,I,J,K,L,M....
object Cell1 = Excel.WorkSheet[10001, 7] =========> 列需要循环100次~例如 G,H,I,J,K,L,M....
Excel.Range.Formula = "= AVERAGE" + "(" + Cell1 + ":" + Cell2 + ")"; =====> "=AVERAGE(G18:G10001)"

"= AVERAGE" + "(" + Cell1 + ":" + Cell2 + ")" 但是这样计算好像不能实现计算功能,请问应该如何去写呢?谢谢指点,在线等待。
...全文
277 点赞 收藏 13
写回复
13 条回复
linxiamaomao 2012年05月28日
getExcelColumnLabel(p0 - 1);

这个方法能给我看一下吗?
回复 点赞
蔡袅 2012年05月28日
这里还有个将列编号转换为,字母编号:
 /// <summary>
/// 根据列编号获取列别名
/// </summary>
/// <param name="num">列编号(从0开始)</param>
/// <returns></returns>
public static String getExcelColumnLabel(int num)
{
String temp = "";
double i = Math.Floor(Math.Log(25.0 * (num) / 26.0 + 1) / Math.Log(26)) + 1;
if (i > 1)
{
double sub = num - 26 * (Math.Pow(26, i - 1) - 1) / 25;
for (double j = i; j > 0; j--)
{
temp = temp + (char)(sub / Math.Pow(26, j - 1) + 65);
sub = sub % Math.Pow(26, j - 1);
}
}
else
{
temp = temp + (char)(num + 65);
}
return temp;
}

思路是这样,你不能通过一行解决全部,必须针对所有行赋予公式。
回复 点赞
蔡袅 2012年05月28日
[Quote=引用 8 楼 的回复:]

引用 6 楼 的回复:
引用 5 楼 的回复:

高人在何处,,,出现一下吧!怎么让我获取会变化的列去进行计算呢?
你的描述不知所谓,无法帮忙


好吧,我简单表述一下,我需要从G列开始每一列的第一行经行计算

一般的Excel表格,单元格计算不是这样写的吗?G1 = "=AVERAGE(G18:G10001)"
在C#程式中是这样表达的 这里的Excel.Range就代表……
[/Quote]这就是公式的难处,所以你需要逐行去循环添加公式,我之前就做了这个自动导出:
    //(计划总产出总数)和(差异数  量总数)的公式,填充 (装配 计划 工时)值
int p0 = 18;
int ExcelRowCount = 7 + dtExcel.Rows.Count;
for (DateTime DT = dtMin; DT <= dtMax; DT = DT.AddDays(1))
{

range = workSheet.get_Range(workSheet.Cells[2, p0], workSheet.Cells[2, p0]);
string sColumnLabel = getExcelColumnLabel(p0 - 1);
range.Formula = String.Concat("=SUM(", sColumnLabel + "8", ":", sColumnLabel + ExcelRowCount, ")");
range = workSheet.get_Range(workSheet.Cells[4, p0], workSheet.Cells[4, p0]);
range.Formula = String.Concat("=", sColumnLabel + "3", "-", sColumnLabel + "2");
range = workSheet.get_Range(workSheet.Cells[5, p0], workSheet.Cells[5, p0]);
double dAleradyWorkHour = 0.0d;
foreach (DataRow dr in dtExcel.Rows)
{

string strdtColumnName = "SELFDate" + DT.ToShortDateString();
string strHourQTY = dr["PerHourQTY"].ToString();//产能数
string strQTY = dr[strdtColumnName].ToString();//排产数
if (string.IsNullOrEmpty(strHourQTY) || string.IsNullOrEmpty(strQTY))
{
continue;
}
else
{
dAleradyWorkHour = dAleradyWorkHour + double.Parse(strQTY) * 1.00 / double.Parse(strHourQTY);
}

}
if (dAleradyWorkHour > 0.1d)
{
range.Cells[1, 1] = dAleradyWorkHour.ToString("N2");
}
p0++;
}



回复 点赞
linxiamaomao 2012年05月28日
"=AVERAGE(G18:G10001)"

我想让单元格经行这样的计算,但是不知道怎么去写!
回复 点赞
linxiamaomao 2012年05月28日
因为列是不断的去经行变化的,所以需要用Cell去获取列和行的坐标,
但是用Cell是无法去经行计算的。
回复 点赞
linxiamaomao 2012年05月28日
[Quote=引用 6 楼 的回复:]
引用 5 楼 的回复:

高人在何处,,,出现一下吧!怎么让我获取会变化的列去进行计算呢?
你的描述不知所谓,无法帮忙
[/Quote]

好吧,我简单表述一下,我需要从G列开始每一列的第一行经行计算

一般的Excel表格,单元格计算不是这样写的吗?G1 = "=AVERAGE(G18:G10001)"
在C#程式中是这样表达的 这里的Excel.Range就代表G1, Excel.Range.Formula = =AVERAGE(G18:G10001)"
但是我这里的G需要不断的变化G,H,I,J,K,L,M....

这样能懂了吗?
回复 点赞
蔡袅 2012年05月28日
你要问问题,不是不停地着急而是想尽办法干净利落的把问题描述清楚
回复 点赞
蔡袅 2012年05月28日
[Quote=引用 5 楼 的回复:]

高人在何处,,,出现一下吧!怎么让我获取会变化的列去进行计算呢?
[/Quote]你的描述不知所谓,无法帮忙
回复 点赞
linxiamaomao 2012年05月28日
高人在何处,,,出现一下吧!怎么让我获取会变化的列去进行计算呢?
回复 点赞
linxiamaomao 2012年05月28日
我有个地方写错了!
object Cell1 = Excel.WorkSheet[18, 7] =======> 列需要循环100次~例如 G,H,I,J,K,L,M....
object Cell2 = Excel.WorkSheet[10001, 7] =========> 列需要循环100次~例如 G,H,I,J,K,L,M....
回复 点赞
阿拉敏敏 2012年05月28日
看不懂。
回复 点赞
linxiamaomao 2012年05月28日
请问是看得懂还是看不懂啊?都回一句话啊!让我看到点希望!
回复 点赞
linxiamaomao 2012年05月28日
补充: 就这样的计算后单元格结果是 =AVERAGE(System.__ComObject:System.__ComObject)
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告