在逐个单元格读写内容时速度太慢

本文关键字:速度 单元格 读写 | 更新日期: 2023-09-27 18:09:26

我开发了一个应用程序,读取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");
            }
        }

在逐个单元格读写内容时速度太慢

使用range. Copy复制一个已加载的xls的范围到剪贴板。然后使用range. pastspecial将剪贴板内容粘贴到新的xls中。在这里,您可以声明将哪些内容复制到新工作表的哪个区域。