在逐个单元格读写内容时速度太慢
本文关键字:速度 单元格 读写 | 更新日期: 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中。在这里,您可以声明将哪些内容复制到新工作表的哪个区域。