C#如何将Word文件中的每个表写入其自己的Excel文件

时间:2018-07-30 19:28:59

标签: c# excel winforms ms-office office-interop

我正在尝试使用C#WinForms编写代码,该代码允许用户选择目录树,并将所有表数据从Word文档提取到excel文件中。目前,代码已编译,您可以选择目录等,但是一旦它开始遍历每个表的循环,它将崩溃。

程序成功打开第一个word文件并写入第一个excel文件(table_1_whatever.xlsx),并将其保存在目标文件夹中。但是,在同一文件的第二个表上,我在以下代码行中收到此错误:

    worksheet.Cells[row, col] = objExcelApp.WorksheetFunction.Clean(table.Cell(row, col).Range.Text);

System.Runtime.InteropServices.COMException:'所请求的集合成员不存在。'

我似乎无法弄清为什么它不存在。每次它通过foreach循环时,都应该创建一个新的工作表,但是似乎没有用。欢迎任何见解,示例或建议!

代码:

    private void WordRunButton_Click(object sender, EventArgs e)
    {

        var excelApp = new excel.Application();
        excel.Workbooks workbooks = excelApp.Workbooks;
        var wordApp = new word.Application();
        word.Documents documents = wordApp.Documents;
        wordApp.Visible = false;
        excelApp.Visible = false;

        string[] fileDirectories = Directory.GetFiles(WordSourceBox.Text, "*.doc*",
               SearchOption.AllDirectories);

        foreach (var item in fileDirectories)
        {
            word._Document document = documents.Open(item);
            int tableCount = 1;

            foreach (word.Table table in document.Tables)
            {
                if (table.Cell(1, 1).ToString() != "Doc Level")
                {
                    string wordFile = item;
                    appendName = Path.GetFileNameWithoutExtension(wordFile) + "_Table_" + tableCount + ".xlsx";

                    var workbook = excelApp.Workbooks.Add(1);
                    excel._Worksheet worksheet = (excel.Worksheet)workbook.Sheets[1];

                    for (int row = 1; row <= table.Rows.Count; row++)
                    {
                        for (int col = 1; col <= table.Columns.Count; col++)
                        {
                            var cell = table.Cell(row, col);
                            var range = cell.Range;
                            var text = range.Text;

                            var cleaned = excelApp.WorksheetFunction.Clean(text);

                            worksheet.Cells[row, col] = cleaned;
                        }
                    }
                    workbook.SaveAs(Path.Combine(WordOutputBox.Text, Path.GetFileName(appendName)), excel.XlFileFormat.xlWorkbookDefault);

                    workbook.Close();
                    Marshal.ReleaseComObject(workbook);
                }
                else
                {
                    WordOutputStreamBox.AppendText(String.Format("Table {0} ignored\n", tableCount));
                }

                WordOutputStreamBox.AppendText(appendName + "\n");
                tableCount++;
            }

            document.Close();
            Marshal.ReleaseComObject(document);
            WordOutputStreamBox.AppendText(item + "\n");
        }


        WordOutputStreamBox.AppendText("\nAll files parsed");

        excelApp.Application.Quit();
        workbooks.Close();
        excelApp.Quit();

        WordOutputStreamBox.AppendText("\nExcel files closed");

        Marshal.ReleaseComObject(workbooks);
        Marshal.ReleaseComObject(excelApp);
        WordOutputStreamBox.AppendText("\nExcel files released");

        wordApp.Application.Quit();
        wordApp.Quit();
        WordOutputStreamBox.AppendText("\nWord files have been quit");

        Marshal.ReleaseComObject(documents);
        Marshal.ReleaseComObject(wordApp);
        WordOutputStreamBox.AppendText("\nWord files have been released\n");
    }

编辑1 :(很抱歉第一次在错误的位置发帖!)

好,所以问题已经被隔离了。

代码的代码逻辑很好,实际上表格在那里。问题是这些文件的第二张表中有一组拆分单元格,因此,当它到达包含它的单元格时,程序将崩溃。

作为临时解决方案,我只是将其设置为忽略标头==的表。有谁知道一种实际上允许提取此数据的解决方案?

0 个答案:

没有答案