【问题标题】:use Excel Objects (Worksheet, Workbooks ...) in Classes/Objects在类/对象中使用 Excel 对象(工作表、工作簿...)
【发布时间】:2016-11-29 21:15:40
【问题描述】:

我在将 Excel 工作表导入摘要工作簿时遇到问题。

首先我尝试将数据导入为 DataTable,使用:

`Dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

            tableName = GetTableNames(Dt);

            com = new OleDbDataAdapter(SqlQuery(tableName[0]), conn);

            com.Fill(DtSet);

            Dt = DtSet.Tables[0];`

除了在将数据复制到新工作表后某些标题丢失了之外,一切正常:

private static void ImportData(DataTable source, string p)
    {
        int pos = Globals.ThisWorkbook.Sheets.Count;
        object lastSheet = Globals.ThisWorkbook.Sheets.get_Item(pos);
        Globals.ThisWorkbook.Sheets.Add(Type.Missing, lastSheet, Type.Missing, Type.Missing);
        Excel.Worksheet ws = (Excel.Worksheet)Globals.ThisWorkbook.ActiveSheet;
        ws.Name = p;
        // column headings
        for (var i = 0; i < source.Columns.Count; i++)
        {
            ws.Cells[1, i + 1] = source.Columns[i].ColumnName;
        }

        // rows
        for (var i = 0; i < source.Rows.Count; i++)
        {
            // to do: format datetime values before printing
            for (var j = 0; j < source.Columns.Count; j++)
            {
                ws.Cells[i + 2, j + 1] = source.Rows[i][j];
            }
        }
    }

其次,我希望通过互操作导入来修复它,所以我实现了这个:

        public Excel.Worksheet GetWorksheet(string path)
    {
        Excel.Application vApp = new Excel.Application();
        Excel.Workbook vBook = vApp.Workbooks.Open(path);
        Excel.Worksheet ws = vBook.Sheets.get_Item(1);
        vBook.Close();
        vApp.Quit();
        return ws;
    }

似乎也可以正常工作,直到我尝试将此工作表复制到活动工作簿:

        private static void ImportData(Excel.Worksheet source, string p)
    {
        int pos = Globals.ThisWorkbook.Sheets.Count;
        source.Copy(Globals.ThisWorkbook.Worksheets[pos]);            
    }

这应该将源代码复制到Globals.ThisWorkbook 中的最后一个位置...但我得到的只是一个 COMException

现在我已经没有办法解决这个问题了。 希望你能帮忙。

米尔科

【问题讨论】:

    标签: c# excel visual-studio


    【解决方案1】:

    我建议不要使用 COM 对象。尝试使用 OpenXML 和 ClosedXML 动态创建 Excel 表格。

    [http://www.c-sharpcorner.com/article/closed-xml-to-read-excel-files-in-asp-net-c-sharp/]

    希望这会有所帮助!

    【讨论】:

    • 感谢您的评论,问题是未经批准,我公司不允许使用外部库或软件。该软件需要在两天内完成,审批需要很长时间。 :-)
    • 是的,我能理解。您正在使用 Microsoft.Interop.Excel 对吗?我也用过。我们的产品托管在客户购买的云服务器中。我们无法说服我们的客户在服务器中安装 Microsoft Office Primary Interop Assembly 包。所以我使用了完全免费的 openXML 和 ClosedXML。高效的代码性能也很出色。
    【解决方案2】:

    感谢发帖的人:StackOverflow

    我需要将源工作簿加载到活动应用程序中,而不是启动自己的应用程序并从那里获取工作表:

                Excel.Application destApp = Globals.ThisWorkbook.Application;
                Excel.Workbook destWB = destApp.Workbooks[1];
                Excel.Workbook sourceWB = destApp.Workbooks.Open(d.Path);
                int pos = Globals.ThisWorkbook.Sheets.Count;
                Excel.Worksheet destWS = ((Excel.Worksheet)destWB.Worksheets[pos]);
                Excel.Worksheet sourceWS = ((Excel.Worksheet)sourceWB.Worksheets[1]);
                sourceWS.Name = d.Name;
                sourceWB.Save();
                sourceWS.Copy(destWS);
                sourceWB.Close();
    

    仅此而已,而且速度非常快。

    【讨论】:

      猜你喜欢
      • 2013-08-17
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 2018-08-30
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      相关资源
      最近更新 更多