Xuất dữ liệu hiển thị từ datagridview ra excel quá chậm

Sau khi đã load dữ liệu lên datagridview. Bây giờ em xuất dữ liệu hiển thị từ datagridview ra excel nhưng quá trình xuất quá chậm. Nhờ các anh/chị xem giúp em cần thêm code hay chỉnh sửa gì, ở dòng nào nữa để quá trình xuất được nhanh hơn.
Dưới là code export:

Microsoft.Office.Interop.Excel.Application objexcelapp = new Microsoft.Office.Interop.Excel.Application();
objexcelapp.Application.Workbooks.Add(Type.Missing );
objexcelapp.Columns.ColumnWidth = 25;
for (int i = 1; i < gridviewID.Columns.Count + 1; i++)
{
objexcelapp.Cells[1, i] = gridviewID.Columns[i - 1].HeaderText;
}
/*For storing Each row and column value to excel sheet*/
for (int i = 0; i < gridviewID.Rows.Count; i++)
{
for (int j = 0; j < gridviewID.Columns.Count; j++)
{
if (gridviewID.Rows.Cells[j].Value != null)
{
objexcelapp.Cells[i + 2, j + 1] = gridviewID.Rows.Cells[j].Value.ToString();
}
}
}
MessageBox.Show("Da gop xong theo duong dan D:\\" + excelFilename + ".xlsx");
objexcelapp.ActiveWorkbook.SaveCopyAs("D:\\" + excelFilename + ".xlsx");
objexcelapp.ActiveWorkbook.Saved = true;
 

quanltv

Sư phụ của ADMIN
Bạn đã chạy thử trên nhiều máy với các cấu hình và nhiều phiên bản Office khác nhau chưa?
 
Em chạy trên 3 máy rồi nhưng vẫn chậm, với dữ liệu ít thì ok nhưng dữ liệu nhiều dòng(10.000) cột(50) ngồi chờ lâu quá thậm chí là đứng máy.

Bạn đã chạy thử trên nhiều máy với các cấu hình và nhiều phiên bản Office khác nhau chưa?
 

quanltv

Sư phụ của ADMIN
Vòng lặp thứ nhất của bạn là duyệt từng cột để gán HeaderText, có thể đổi biến chạy và biểu thức tính, ghép vào 2 vòng lặp bên dưới luôn. Vòng lặp sau duyệt cột trước, trong đó có 2 lệnh, 1 là gán HeaderText, 2 là duyệt từng hàng, thử xem
Câu lệnh điều kiện này có thể bỏ
if (gridviewID.Rows.Cells[j].Value != null)
vì bạn vẫn duyệt tất cả các ô trong bảng, ô trống thì nó gán là trống thôi, không cần phải kiểm tra điều kiện này.

gridviewID.Rows.Count
2 giá trị này tính trước từ đầu tiên, gán bằng m và n cho nó gọn, máy đỡ phải tính toán và đếm nhiều lần.
 
Mình bỏ câu lệnh này: if (gridviewID.Rows.Cells[j].Value != null) thì sinh ra lỗi: "Object reference not set to an instance of an object"
Còn câu này: 2 giá trị này tính trước từ đầu tiên, gán bằng m và n cho nó gọn, máy đỡ phải tính toán và đếm nhiều lần.==> mình chưa hiểu ?

Vòng lặp thứ nhất của bạn là duyệt từng cột để gán HeaderText, có thể đổi biến chạy và biểu thức tính, ghép vào 2 vòng lặp bên dưới luôn. Vòng lặp sau duyệt cột trước, trong đó có 2 lệnh, 1 là gán HeaderText, 2 là duyệt từng hàng, thử xem
Câu lệnh điều kiện này có thể bỏ
if (gridviewID.Rows.Cells[j].Value != null)
vì bạn vẫn duyệt tất cả các ô trong bảng, ô trống thì nó gán là trống thôi, không cần phải kiểm tra điều kiện này.

gridviewID.Rows.Count
2 giá trị này tính trước từ đầu tiên, gán bằng m và n cho nó gọn, máy đỡ phải tính toán và đếm nhiều lần.
 

quanltv

Sư phụ của ADMIN
Mình bỏ câu lệnh này: if (gridviewID.Rows.Cells[j].Value != null) thì sinh ra lỗi: "Object reference not set to an instance of an object"
Còn câu này: 2 giá trị này tính trước từ đầu tiên, gán bằng m và n cho nó gọn, máy đỡ phải tính toán và đếm nhiều lần.==> mình chưa hiểu ?
Ý là bạn gán m=gridviewID.Rows.Count, n=m=gridviewID.Columns.Count trước khi vào vòng lặp, trong vòng lặp thì gọi m,n thôi
 
Mình gán m,n như bạn nói nhưng vẫn vậy. Xuất datagridview: 7000 dòng, 12 côt mất 3 phút. Và nếu mình bỏ câu kiểm tra: if (gridviewID.Rows.Cells[j].Value != null ====> thì bị lỗi "Object reference not set to an instance of an object"

Ý là bạn gán m=gridviewID.Rows.Count, n=m=gridviewID.Columns.Count trước khi vào vòng lặp, trong vòng lặp thì gọi m,n thôi
 

quanltv

Sư phụ của ADMIN
Mình gán m,n như bạn nói nhưng vẫn vậy. Xuất datagridview: 7000 dòng, 12 côt mất 3 phút. Và nếu mình bỏ câu kiểm tra: if (gridviewID.Rows.Cells[j].Value != null ====> thì bị lỗi "Object reference not set to an instance of an object"
Lệnh If này là bạn kiểm tra ô khác rỗng thì mới gán, bạn thử bỏ thêm hàm ToString() xem sao, nếu vẫn lỗi thì giữ nguyên cả If. Còn 1 ý nữa là bạn ghép lệnh gán HeaderText vào bên trong 2 vòng lặp lồng nhau kia chưa.
 
Vẫn vậy bạn ak. có lẻ code này chưa tối ưu được, hjx
Lệnh If này là bạn kiểm tra ô khác rỗng thì mới gán, bạn thử bỏ thêm hàm ToString() xem sao, nếu vẫn lỗi thì giữ nguyên cả If. Còn 1 ý nữa là bạn ghép lệnh gán HeaderText vào bên trong 2 vòng lặp lồng nhau kia chưa.
 
Mình dùng thư viện NPOI với code xuất excel như thế này:
Row row;
Cell cell;
for (int i = 0; i < dataGridView2.RowCount ; i++)
{
row = sheet.CreateRow(i);
for (int j = 0; j <= dataGridView2.ColumnCount; j++)
{
cell = row.CreateCell(j);
sheet.GetRow(i).GetCell(j).SetCellValue(dataGridView2.Rows.Cells[j].Value.ToString());
}
}

Nhưng báo lỗi: Index was out of range. Must be non-negative and less than the size of the collection.Parameter name: index


Ai có biết lỗi gì ko sửa giúp mình.
 
Sửa lần cuối:

quanltv

Sư phụ của ADMIN
Index was out of range
Lỗi chỉ số vượt quá giới hạn, i chạy từ 0 đến RowCount-1, còn j chạy từ 0 đến ColumnCount-1
Cách sửa : j < ..., bỏ dấu bằng đi, hoặc j <= ColumnCount-1
 
Hết lỗi đó bây giờ báo lỗi: "Object reference not set to an instance of an object"
Tại dòng: "sheet.GetRow(i).GetCell(j).SetCellValue(dataGridVi ew2.Rows.Cells[j].Value.ToString());"
Rõ ràng là có dữ liệu trong datagridview2 rồi mà ta,
 

snowolf901

Tuyết Lang
mình nghĩ add số lượng row và column như thế thì chuyện lâu cũng bình thường á :)
 
Mình dùng thư viện NPOI, code vẫn thế, mình chỉ code sửa lại dữ liệu đầu vào datagrid thôi, hj.
 
Code xuất excel nhanh sử dụng thư viện NPOI. Thư viện thì mình up ko dược do tài khoản của mình bị khóa phần úp tập tin mất. Mọi người tìm giúp mình nhé. Dưới đây là code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;


using System.IO;
using NPOI.HSSF.UserModel;
using NPOI.HPSF;
using NPOI.POIFS.FileSystem;
using NPOI.HSSF.UserModel.Contrib;
using NPOI.SS.Util;
using NPOI.SS.UserModel;


namespace ExportExcel
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


private void button1_Click(object sender, EventArgs e)
{


InitializeWorkbook();
try
{


Sheet sheet = hssfworkbook.CreateSheet("NewSheet");


Row row ;
Cell cell;
for (int i = 0; i <= 10000;i++ )
{
row = sheet.CreateRow(i);
for (int j = 0; j <= 100;j++ )
{
cell = row.CreateCell(j);
sheet.GetRow(i).GetCell(j).SetCellValue("Data");

}
}
WriteToFile();
}
catch(Exception ex)
{
MessageBox.Show("error: " + ex.Message);
}


}
static HSSFWorkbook hssfworkbook;


static void WriteToFile()
{
//Write the stream data of workbook to the root directory
FileStream file = new FileStream(@"test.xls", FileMode.Create);
hssfworkbook.Write(file);
file.Close();
}


static void InitializeWorkbook()
{
hssfworkbook = new HSSFWorkbook();


//Create a entry of DocumentSummaryInformation
DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company = "NPOI Team";
hssfworkbook.DocumentSummaryInformation = dsi;


//Create a entry of SummaryInformation
SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
si.Subject = "NPOI SDK Example";
hssfworkbook.SummaryInformation = si;
}
}
}
 

Thống kê

Chủ đề
100,657
Bài viết
467,427
Thành viên
339,833
Thành viên mới nhất
duythinh2222
Top