使用 C# 和 VSTO 为 Excel 中不带选择的所有单元格设置格式
本文关键字:选择 单元格 格式 设置 VSTO Excel 使用 | 更新日期: 2023-09-27 18:35:46
假设我想为 Excel 工作表中的所有单元格设置格式("文本"、"数字"、"百分比"、"日期"等)。
我现在如何设置单行或单列的格式。例如,为第 3 行的所有单元格设置"百分比"格式的代码如下所示(小数分隔符取决于您的 Windows 本地化):
this.worksheet.Rows[3].NumberFormat = "%0,00";
但是,当我尝试使用以下代码对工作表的所有单元格执行相同的操作时:
this.worksheet.Cells.NumberFormat = "%0,00";
,我遇到了一个问题 - 实际上,单元格的格式将被更改,但格式错误(在本例中,实际设置的格式将是"#000%",Excel 将其识别为"自定义格式")。
我知道如何使用选择来解决这个问题。因此,以下代码完美地执行了上述任务:
this.worksheet.Cells.Select();
this.worksheet.Application.Selection.NumberFormat = "%0,00";
但是,我真的很想在没有选择的情况下解决这个问题。我该怎么做?
虽然我发现你对试图帮助你的人的反应非常令人反感,但我试图忽略这一点,以记住我们在这里试图互相帮助,并专注于为这种情况找到解决方案。
所以这是我取悦你的最后一次尝试......
[TestMethod]
public void TestExcelNumberFormatOnWholeSheet()
{
Excel.Application excel = new Excel.Application();
excel.Visible = true;
Excel.Workbook workbook1 = excel.Workbooks.Add();
Excel.Worksheet sheet = workbook1.Sheets.Add();
var lastCol = sheet.Range["a1"].End[Excel.XlDirection.xlToRight].Column;
var lastRow = sheet.Cells[65536, lastCol].End[Excel.XlDirection.xlDown].Row;
sheet.Range["a1", sheet.Cells[lastRow, lastCol]].NumberFormat = "%0,00";
}
我已经在这里测试了它并且似乎可以工作(请记住,正如您已经提到的,您可能需要根据您的本地化切换十进制字符)。
让我回答我自己的问题。
如果很快,而不是代码
this.worksheet.Cells.NumberFormat = "%0,00";
,应该使用以下一个:
((dynamic)this.worksheet.Cells).NumberFormat = "%0,00";
然后,结果格式将是正确的!
现在,我对此的解释是:NumberFormat
属性看起来仅适用于dynamic
类型,而不适用于Microsoft.Office.Interop.Excel.Range
类型。当一个人写this.worksheet.Cells
或this.worksheet.Range["A1", "C3"]
之类的东西时,他/她会得到Microsoft.Office.Interop.Excel.Range
类型;当一个人写this.worksheet.Rows[3]
的东西时,他/她得到dynamic
类型。因此,为了使用 NumberFormat
属性,只需将Microsoft.Office.Interop.Excel.Range
对象转换为dynamic
对象即可!