【问题标题】:Trying to add multiple sheets to excel试图将多张工作表添加到excel
【发布时间】:2013-02-15 06:55:12
【问题描述】:

我正在尝试以编程方式将工作表添加到新的 Excel 文档中。

我的预期输出是名为“test1-20”的工作表,但我得到的是“Sheet1-19,test20”。

为什么这不起作用?

Workbook workbook;
Application objExcel;

objExcel = new Application();
objExcel.Visible = false;
objExcel.DisplayAlerts = false;

for (var i = 0; i < worksheets.Count; i++)
{
    workbook= objExcel.Workbooks.Add(Missing.Value);
    var worksheet = (Worksheet)workbook.Worksheets.get_Item(i + 1);
    worksheet.Name = string.Format("test{0}", i + 1);
}

【问题讨论】:

  • 等一下。您是否尝试添加工作表或工作簿? Workbooks.Add() 在这里看起来很奇怪。
  • @lc。如果您正在创建新的 Excel 应用程序对象,则不会。您可以添加一个新工作簿,向其中添加一些工作表,对工作表执行您需要执行的操作,然后保存它,而不是打开现有工作簿。
  • @JMK 但这是在添加工作表。计数新工作簿(复数形式)......可能不是故意的?或者我只是错过了一些东西
  • @lc。抱歉,您当然是正确的,这不应该在 for 循环中,在这种情况下,您要创建 20 个工作簿并为每个工作簿添加一个工作表。

标签: c# excel worksheet


【解决方案1】:

试试这个:

using System;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;

void MyMethod()
{
    try
    {
        var _excel = new Excel();

        var wb = _excel.Workbooks.Add();
        var collection = new Microsoft.Office.Interop.Excel.Worksheet[20];

        for (var i = 19; i >= 0; i--)
        {
            collection[i] = wb.Worksheets.Add();
            collection[i].Name = String.Format("test{0}", i + 1);
        }

        for (var i = 0; i < 3; i++)
        {
            wb.Worksheets[21].Delete();
        }

        //collection is an array of worksheet objects,
        //the worksheet objects in your workbook.
        //You can access each individual worksheet and
        //work with it in the same way you access any object in an array

        var thisWorksheet = collection[9];
        var thisRange = thisWorksheet.Range["A1"];
        thisRange.Value = "Hello World";

        wb.SaveAs(@"c:\test\whatever.xlsx");
        wb.Close();
    }
    finally
    {
        Marshal.ReleaseComObject(_excel);
    }
}

您的 visible 属性默认设置为 false,因此无需显式执行此操作,上述代码中未显示任何警报,因此也不需要这样做。我已经测试了上面的代码并且可以确认它可以工作。

【讨论】:

  • 感谢您的帮助!这效果更好。但这仍然不对。我得到表'test19-test1,Sheet1-20'。
  • 我会在最后添加表格:collection[i] = wb.Worksheets.Add(After: wb.Sheets[wb.Sheets.Count]);
  • 谢谢头。现在床单的顺序正确,但我仍然得到床单'Sheet1-20,test1-20'。为什么会有“Sheet1-20”?
  • 我想知道它是否与您机器上的 Excel 配置方式有关。当我运行@JMK 的代码时,我得到了 20 张带有我期望的名称的表格:Test1-1Test1-20。 (我在他的 String.Format 中添加了破折号。)
  • 我已经更新了我的答案,如果您复制/粘贴它现在将完全按照您的意愿行事
【解决方案2】:

这是我的代码:

' first worksheet
If oExcel.Application.Sheets.Count() < 1 Then
    oSheet = CType(oBook.Worksheets.Add(), Excel.Worksheet)
Else
    oSheet = oExcel.Worksheets(1)
End If
oSheet.Name = "one"
oSheet.Range("B1").Value = "First One"

' second
If oExcel.Application.Sheets.Count() < 2 Then
    oSheet = CType(oBook.Worksheets.Add(), Excel.Worksheet)
Else
    oSheet = oExcel.Worksheets(2)
End If
oSheet.Name = "two"
oSheet.Range("B1").Value = "Second one"

' third
If oExcel.Application.Sheets.Count() < 3 Then
    oSheet = CType(oBook.Worksheets.Add(), Excel.Worksheet)
Else
    oSheet = oExcel.Worksheets(3)
End If
oSheet.Name = "three"
oSheet.Range("B1").Value = "Thrid"

' next
If oExcel.Application.Sheets.Count() < 4 Then
    oSheet = CType(oBook.Worksheets.Add(), Excel.Worksheet)
Else
    oSheet = oExcel.Worksheets(4)
End If
oSheet.Name = "four"
oSheet.Range("B1").Value = "Four"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多