在类/对象中使用Excel对象(工作表,工作簿...)

我在将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

现在我用尽了想法如何解决这个问题。 希望你能帮助。

米尔科


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

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

希望这可以帮助!


感谢这里发布的这个人: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();

这一切,它的速度非常快。

链接地址: http://www.djcxy.com/p/35769.html

上一篇: use Excel Objects (Worksheet, Workbooks ...) in Classes/Objects

下一篇: Copying Data from one Sheet to Another using NPOI