首页 > 解决方案 > C#如何将Word文件中的每个表写入自己的Excel文件

问题描述

我正在尝试在 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:(抱歉第一次发错地方!)

好的,所以问题已被隔离...

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

作为临时修复,如果标题 == 不管,我刚刚将其设置为忽略该表。有谁知道实际上允许提取这些数据的解决方案?

标签: c#excelwinformsms-officeoffice-interop

解决方案


推荐阅读