使用 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";

但是,我真的很想在没有选择的情况下解决这个问题。我该怎么做?

使用 C# 和 VSTO 为 Excel 中不带选择的所有单元格设置格式

虽然我发现你对试图帮助你的人的反应非常令人反感,但我试图忽略这一点,以记住我们在这里试图互相帮助,并专注于为这种情况找到解决方案。

所以这是我取悦你的最后一次尝试......

[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.Cellsthis.worksheet.Range["A1", "C3"]之类的东西时,他/她会得到Microsoft.Office.Interop.Excel.Range类型;当一个人写this.worksheet.Rows[3]的东西时,他/她得到dynamic类型。因此,为了使用 NumberFormat 属性,只需将Microsoft.Office.Interop.Excel.Range对象转换为dynamic对象即可!