使用 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.Cells
或 this.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
对象!
假设我要为所有设置格式("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.Cells
或 this.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
对象!