0

我开发了一个应用程序,它读取 32 个 xls 文件并将其内容写入一个 excel 文件。程序运行良好,但速度太慢(如果是 32 个文件则需要 20-25 分钟),因为我正在逐个单元地读写。有什么办法可以让它更快。就我而言,每个单元格都有不同的格式、字体、边框等。我可以一次读取整个内容的格式并将其粘贴到结果文件中吗?我使用的是 Microsoft.Office.Interop.Excel API。这是我正在使用的代码

Cursor.Current = Cursors.WaitCursor;
            // data member initialization for reading the sheet
            Excel.Application app;
            Excel.Workbook workbook;
            Excel.Worksheet worksheet;
            Excel.Range range;

            // data member initialization for writing sheet
            Excel.Application finalApp;
            Excel.Workbook finalWorkBook;
            Excel.Worksheet finalWorkSheet;

            String path = this.textBox1.Text;
            String numberOfFiles = (String)this.comboBox1.SelectedItem;
            int count = 1;
            int row = 1, col = 2;
            int startingrowIndex = 1;
            int endingrowIndex = 1;
            int valueCount = 1;
            string value = textBox2.Text;
            try
            {
                // Object creation for the final sheet
                finalApp = new Excel.ApplicationClass();
                finalApp.Visible = true;
                finalWorkBook = finalApp.Workbooks.Add(1);
                finalWorkSheet = (Excel.Worksheet)finalWorkBook.Sheets[1];


                // opening a excel file
                app = new Excel.ApplicationClass();
                Excel.Borders b=null;
                Excel.Borders fb = null;
                try
                {
                    for (int k = 0; k < Int32.Parse(numberOfFiles); k++)
                    {
                        fullPath = @path + @"\" + count + ".xls";
                        workbook = app.Workbooks.Open(fullPath, Missing.Value, Missing.Value,
                            Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value
                            , Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                            Missing.Value);
                        worksheet = (Excel.Worksheet)workbook.Sheets.get_Item(1);
                        range = worksheet.UsedRange;
                        int cnum1 = range.Columns.Count;
                        int rnum1 = range.Rows.Count;
                        int i, j;
                        for (i = 1; i <= rnum1; i++)
                        {
                            for (j = 1; j <= cnum1; j++)
                            {
                                if ((range.Cells[i, j] as Excel.Range).Value2 != null)
                                {
                                    string value1 = (range.Cells[i, j] as Excel.Range).Value2.ToString();
                                    finalWorkSheet.Cells[row, col] = value1;
                                }
                                b = (Excel.Borders)(range.Cells[i, j] as Excel.Range).Borders;
                                fb = (finalWorkSheet.Cells[row, col] as Excel.Range).Borders;

                                fb[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeBottom].Weight = b[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeBottom].Weight;
                                fb[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeTop].Weight = b[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeTop].Weight;
                                fb[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeLeft].Weight = b[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeLeft].Weight;
                                fb[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeRight].Weight = b[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeRight].Weight;

                                fb[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeBottom].LineStyle = b[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeBottom].LineStyle;
                                fb[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeTop].LineStyle = b[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeTop].LineStyle;
                                fb[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeLeft].LineStyle = b[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeLeft].LineStyle;
                                fb[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeRight].LineStyle = b[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeRight].LineStyle;
                                (finalWorkSheet.Cells[row, col] as Excel.Range).Interior.Color = (range.Cells[i, j] as Excel.Range).Interior.Color;
                                (finalWorkSheet.Cells[row, col] as Excel.Range).Font.Color = (range.Cells[i, j] as Excel.Range).Font.Color;

                                (finalWorkSheet.Cells[row, col] as Excel.Range).Interior.PatternColor = (range.Cells[i, j] as Excel.Range).Interior.PatternColor;
                                (finalWorkSheet.Cells[row, col] as Excel.Range).Interior.Pattern = (Excel.XlPattern)(range.Cells[i, j] as Excel.Range).Interior.Pattern;
                                (finalWorkSheet.Cells[row, col] as Excel.Range).WrapText =(range.Cells[i, j] as Excel.Range).WrapText;
                                col++;
                            }
                            row++;
                            col = 2;
                        }
                        //finalWorkBook.SaveAs("hello.xlsx", Excel.XlFileFormat.xlExcel4Workbook, Missing.Value,
                        //Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value,
                        //Missing.Value, Missing.Value, Missing.Value);
                        endingrowIndex = row-1;
                        finalWorkSheet.Cells[startingrowIndex,1]=value+valueCount;
                        (finalWorkSheet.Cells[startingrowIndex, 1] as Excel.Range).VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
                        (finalWorkSheet.Cells[startingrowIndex, 1] as Excel.Range).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                        (finalWorkSheet.Cells[startingrowIndex, 1] as Excel.Range).WrapText = true;
                        finalWorkSheet.get_Range(finalWorkSheet.Cells[startingrowIndex, 1], finalWorkSheet.Cells[endingrowIndex, 1]).Merge(Type.Missing);
                        startingrowIndex = row + 1;
                        workbook.Close(false, false, Missing.Value);
                        count++;
                        row++;
                        col = 2;
                        valueCount++;
                    }
                    Cursor.Current = Cursors.Default;
                    MessageBox.Show("Successfully Completed");
                }
                catch (FileNotFoundException fnfe)
                {
                    Cursor.Current = Cursors.Default;
                    MessageBox.Show("Error while opening the file "+fullPath);
                }
                //finalWorkBook.Close(true,false,Missing.Value);
            }
            catch (Exception ex)
            {
                Cursor.Current = Cursors.Default;
                MessageBox.Show(@"Some Error has occurred.Please check the path Correctly
                whether it's correct or try again");
            }
        }

任何帮助,将不胜感激。

4

1 回答 1

0

使用 range.copy 将加载的 xls 的范围复制到剪贴板。然后使用range.PasteSpecial将剪贴板内容粘贴到新的 xls 中。在那里,您可以说明复制到新工作表中哪个范围的内容。

于 2013-04-17T06:11:14.607 回答