【问题标题】:How can I copy a single worksheet from one .XLS file to another?如何将单个工作表从一个 .XLS 文件复制到另一个?
【发布时间】:2015-10-01 11:07:03
【问题描述】:

我正在努力将整个工作表从现有的 .XLS 文件复制到我在我的应用程序中创建的新 Excel 文件中。到目前为止,这是我的代码:

Microsoft.Office.Interop.Excel.Workbook tempworkbook = workbooks.Open(
           Directory.GetCurrentDirectory() + "\\Template.xlsx", //FileName
           0, //UpdateLinks
           true, //ReadOnly
           5, //Format
           Type.Missing, //Password
           Type.Missing, //WriteResPassword
           true,//IgnoreReadOnlyRecommended
           Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, //Origin
           "\t", //Delimiter
           false, //Editable
           false, //Notify
           0, //Converter
           false, //AddToMRU
           1, //Local
           0 //CorruptLoad
           );
        Microsoft.Office.Interop.Excel.Worksheet tmp1 = (Microsoft.Office.Interop.Excel.Worksheet)tempworkbook.Sheets["GSM Data"];
        string test = tmp1.get_Range("B2", "B2").Value2.ToString(); //test to see if sheet can be accessed - value should be "Database";
        tmp1.Copy(Type.Missing, wsGSMData); //copy worksheet into wsGSMData (which is the sheet in the new XLS file) 

但是我在最后一行遇到的错误是:

服务器抛出异常。 (来自 HRESULT 的异常:0x80010105 (RPC_E_SERVERFAULT))

基本上,我提取为tmp1 的工作表应该进入名为wsGSMData 的工作表,这是我在新的.XLS 工作簿(称为子工作簿):

 Microsoft.Office.Interop.Excel.Worksheet wsGSMData = (Microsoft.Office.Interop.Excel.Worksheet)subsetworkbook.Sheets["Sheet7"];

我做错了什么?

【问题讨论】:

  • 你从哪里得到 wsGSMData?是否在同一个 Excel 进程中运行(即是否通过同一个 Excel 应用程序对象获取)?
  • 这是我在我创建的新 XLS 工作簿(子集工作簿)中创建的 7 张工作表之一:subsetworkbook.Sheets.Add(Type.Missing, Type.Missing, 7, Type.Missing); Microsoft.Office.Interop.Excel.Worksheet wsGSMData = (Microsoft.Office.Interop.Excel.Worksheet)subsetworkbook.Sheets["Sheet7"];

标签: c# excel


【解决方案1】:

您的 Excel 文件的访问模式可能存在问题,这会导致 (HRESULT 异常:0x80010105 (RPC_E_SERVERFAULT))

尝试检查 Excel 菜单中的设置:审阅 > 共享工作簿 > 允许多个用户进行更改... - 您应该尝试取消选中此复选框。

然后返回您的代码并检查任何可能更改此设置的行,尤其是 SaveAs 函数。如果您看到 xlShared,请将其替换为 xlExclusive(参见下面的示例)。

我在尝试将图表添加到文件时遇到了同样的问题。在我的情况下,没有谷歌搜索的解决方案可以提供帮助,所以我必须自己弄清楚出了什么问题。在尝试通过不同的方法将图表添加到新文件中后,我意识到这一行中的上述异常:

Microsoft::Office::Interop::Excel::ChartObject ^ExcelChartObj = ExcelChartObjs->Add(100, 100, 300, 250); //create chart object (left, top, width, height)

实际上是因为原来的文件从一开始就选中了“允许多个用户更改”复选框,而且我自己的代码也将其重新保存为xlShared - 两次! (不,双重保存不是错误,在我的情况下应该是这样,因为我的程序解决了一项艰巨的任务,我需要在两个不同的步骤中将数据输入到同一个文件中)

这是工作代码(用于 C++/CLI Windows 窗体),它最终使 (HRESULT 的异常:0x80010105 (RPC_E_SERVERFAULT)) 在我的情况下消失了:

ExcelApp->ActiveWorkbook->SaveAs(ExcFileName, Microsoft::Office::Interop::Excel::XlFileFormat::xlOpenXMLWorkbook, Type::Missing, Type::Missing,
    Type::Missing, Type::Missing, Microsoft::Office::Interop::Excel::XlSaveAsAccessMode::xlExclusive, Type::Missing, Type::Missing, Type::Missing,
    Type::Missing, Type::Missing); //save Excel book (access mode - xlExclusive, not xlShared!)

我希望它也能帮助那里的人! :)

【讨论】:

    猜你喜欢
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多