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

Set format for all cells in Excel without selections, using C# and VSTO

假设我要为所有设置格式("Text"、"Number"、"Percent"、"Date" 等等) Excel 工作表中的单元格

我现在如何设置单行或单列的格式。例如,为第 3 行的所有单元格设置 "Percent" 格式的代码如下所示(小数分隔符取决于您的 Windows 本地化):

this.worksheet.Rows[3].NumberFormat = "%0,00";

但是,当我尝试使用以下代码对工作表的所有单元格执行相同操作时:

this.worksheet.Cells.NumberFormat = "%0,00";

,我遇到了一个问题 - 事实上,单元格的格式 将被更改 但格式错误(在本例中,实际设置格式将是“#000%”,被 Excel 识别为 "Custom Format")。

我知道如何使用选择来解决这个问题。因此,以下代码完美地执行了上述任务:

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