Code Export dữ liệu từ DataGridView tới PDF với C#
Giới thiệu
Trong ví dụ này, chúng ta sẽ học các viết code C# để export dữ liệu từ DataGridView ra file PDF tới một thư mục nào đó.
Trong chương trình này, trước hết chúng ta sẽ thực hiện kết nối tới Database và lấy dữ liệu từ Database và hiển thị lên trên lưới như ảnh bên dưới. Bạn có thể tham khảo thêm phần lập trình với Cơ sở dữ liệu hoặc Khoá học đầy đủ với Lập trình .NET
Hướng dẫn
Trước khi chúng ta bắt đầu phần code, chúng ta cần thêm thư viện iTextSharp tới dự án của chúng ta.
Để làm việc này, bạn kích chuột phải ở trên Project củ bạn và chọn menu “Manage NuGet Package“. Sau đó chọn tab “Browse” và tìm kiếm iTextSharp và cài đặt nó.
- Project –> Manage NuGet Package –> Browse tab –> Tìm từ khoá iTextSharp; và rồi cài đặt.
Bây giờ, viết sự kiện Form Load, để lấy dữ liệu từ bảng tblEmployee trong cơ sở dữ liệu và hiển thị lên DataGridView. Trong ví dụ chúng ta giả sử có Database tên là DemoTest, trong đó có bảng
tblEmployee.
1. Code sự kiện Form Load
private void FrmExport_Load(object sender, EventArgs e)
{
SqlConnection sqlCon;
string conString = null;
string sqlQuery = null;
conString = "Data Source=.;Initial Catalog=DemoTest;Integrated Security=SSPI;";
sqlCon = new SqlConnection(conString);
sqlCon.Open();
sqlQuery = "SELECT * FROM tblEmployee";
SqlDataAdapter dscmd = new SqlDataAdapter(sqlQuery, sqlCon);
DataTable dtData = new DataTable();
dscmd.Fill(dtData);
dataGridView1.DataSource = dtData;
}
Rồi, viết sự kiện cho nút Export, chúng ta phải tạo đối tượng PdfTable và đối tượng Document, lấy dữ liệu từ DataGridView, và thêm các hàng và các cột tới document này.
2. Code sự kiện click của nút Export
private void btnPdf_Click(object sender, EventArgs e)
{
if (dataGridView1.Rows.Count > 0)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "PDF (*.pdf)|*.pdf";
sfd.FileName = "Output.pdf";
bool fileError = false;
if (sfd.ShowDialog() == DialogResult.OK)
{
if (File.Exists(sfd.FileName))
{
try
{
File.Delete(sfd.FileName);
}
catch (IOException ex)
{
fileError = true;
MessageBox.Show("Không thể ghi dữ liệu tới ổ đĩa. Mô tả lỗi:" + ex.Message);
}
}
if (!fileError)
{
try
{
PdfPTable pdfTable = new PdfPTable(dataGridView1.Columns.Count);
pdfTable.DefaultCell.Padding = 3;
pdfTable.WidthPercentage = 100;
pdfTable.HorizontalAlignment = Element.ALIGN_LEFT;
foreach (DataGridViewColumn column in dataGridView1.Columns)
{
PdfPCell cell = new PdfPCell(new Phrase(column.HeaderText));
pdfTable.AddCell(cell);
}
foreach (DataGridViewRow row in dataGridView1.Rows)
{
foreach (DataGridViewCell cell in row.Cells)
{
pdfTable.AddCell(cell.Value.ToString());
}
}
using (FileStream stream = new FileStream(sfd.FileName, FileMode.Create))
{
Document pdfDoc = new Document(PageSize.A4, 10f, 20f, 20f, 10f);
PdfWriter.GetInstance(pdfDoc, stream);
pdfDoc.Open();
pdfDoc.Add(pdfTable);
pdfDoc.Close();
stream.Close();
}
MessageBox.Show("Dữ liệu Export thành công!!!", "Info");
}
catch (Exception ex)
{
MessageBox.Show("Mô tả lỗi :" + ex.Message);
}
}
}
}
else
{
MessageBox.Show("Không có bản ghi nào được Export!!!", "Info");
}
}
Bây giờ, chạy ứng dụng của bạn. Khi chúng ta kích trên nút “Export To Pdf“, nó sẽ hỏi nơi chúng ta lưu tệp. Đặt tên file và kích OK. Nó sẽ tạo ra têp pdf với tên file mà chúng ta vừa nhập ở trong thư mục mà chúng ta đã chọn.
Chúc các bạn thành công!
private void btnpdf_Click(object sender, EventArgs e)
{
if (dgvdanhsach.Rows.Count > 0)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = “PDF (*.pdf)|*.pdf”;
sfd.FileName = “Output.pdf”;
bool fileError = false;
if (sfd.ShowDialog() == DialogResult.OK)
{
if (File.Exists(sfd.FileName))
{
try
{
File.Delete(sfd.FileName);
}
catch (IOException ex)
{
fileError = true;
MessageBox.Show(“Không thể ghi dữ liệu tới ổ đĩa. Mô tả lỗi:” + ex.Message);
}
}
if (!fileError)
{
try
{
PdfPTable pdfTable = new PdfPTable(dgvdanhsach.Columns.Count);
pdfTable.DefaultCell.Padding = 3;
pdfTable.WidthPercentage = 100;
pdfTable.HorizontalAlignment = Element.ALIGN_LEFT;
foreach (DataGridViewColumn column in dgvdanhsach.Columns)
{
PdfPCell cell = new PdfPCell(new Phrase(column.HeaderText));
pdfTable.AddCell(cell);
}
foreach (DataGridViewRow row in dgvdanhsach.Rows)
{
foreach (DataGridViewCell cell in row.Cells)
{
pdfTable.AddCell(cell.Value.ToString());
}
}
using (FileStream stream = new FileStream(sfd.FileName, FileMode.Create))
{
Document pdfDoc = new Document(PageSize.A4, 10f, 20f, 20f, 10f);
PdfWriter.GetInstance(pdfDoc, stream);
pdfDoc.Open();
pdfDoc.Add(pdfTable);
pdfDoc.Close();
stream.Close();
}
MessageBox.Show(“Dữ liệu Export thành công!!!”, “Info”);
}
catch (Exception ex)
{
MessageBox.Show(“Mô tả lỗi :” + ex.Message);
}
}
}
}
else
{
MessageBox.Show(“Không có bản ghi nào được Export!!!”, “Info”);
}
}
sao em làm theo mà nó báo lỗi “Mô tả lỗi :” object reference not set to an instance of an object. Thầy chỉ em chỗ em làm sai với ạ. em cám ơn Thầy
Em làm bước này chưa Project –> Manage NuGet Package –> Browse tab –> Tìm từ khoá iTextSharp.
Và em xem dòng nó báo lỗi là dòng nào?
using iTextSharp.text.pdf;
using iTextSharp.text;
Dạ em làm rồi. khi chạy không báo lỗi gì. Chỉ khi thực hiện nhấn nút exp thì nó báo ra lỗi đó. chương trình vẫn chạy bình thường. không có lỗi hay bất cứ gì khác lạ
Em bỏ hết phần try … catch đi để xem dòng code nào bị lỗi, chỉ để thế này thôi rồi chạy xem nó lỗi ở dòng nào.
if (!fileError)
{
PdfPTable pdfTable = new PdfPTable(dgvdanhsach.Columns.Count);
pdfTable.DefaultCell.Padding = 3;
pdfTable.WidthPercentage = 100;
pdfTable.HorizontalAlignment = Element.ALIGN_LEFT;
foreach (DataGridViewColumn column in dgvdanhsach.Columns)
{
PdfPCell cell = new PdfPCell(new Phrase(column.HeaderText));
pdfTable.AddCell(cell);
}
foreach (DataGridViewRow row in dgvdanhsach.Rows)
{
foreach (DataGridViewCell cell in row.Cells)
{
pdfTable.AddCell(cell.Value.ToString());
}
}
using (FileStream stream = new FileStream(sfd.FileName, FileMode.Create))
{
Document pdfDoc = new Document(PageSize.A4, 10f, 20f, 20f, 10f);
PdfWriter.GetInstance(pdfDoc, stream);
pdfDoc.Open();
pdfDoc.Add(pdfTable);
pdfDoc.Close();
stream.Close();
}
MessageBox.Show(“Dữ liệu Export thành công!!!”, “Info”);
}
}
}
else
{
MessageBox.Show(“Không có bản ghi nào được Export!!!”, “Info”);
}
}
dạ báo dòng này pdfTable.AddCell(cell.Value.ToString());
NullReferenceException was unhandled
Em thử nhập hết dữ liệu, không để ô nào trống dữ liệu xem nào
là dữ liệu trong database của em à thầy? Em đâu bỏ trống đâu ta? em có load lên gridbox
MaNV HovaTen GioiTinh NgaySinh QueQuan SoDienThoai Email
123 Nguyễn Văn Tú Nam 19/10/1987 Đụn 123654789 tu@gmail.com
223 Trịnh Văn Dương Nam 19/07/1987 Rau má 528963471 duong@gmail.com
852 Đặng Hoàng Lâm Bê 13/06/1989 Tộc 456987455 lam@gmail.com
235 Trần Thanh Trúc Nữ 22/05/1996 đồng Nai 135465412 truc@gmail.com
1 Đàm Đình Ngọc Nam 03/09/2020 Tứ Kỳ 5645645 ngoc@gmail.com
2 Nguyễn thị B Nữ 03/09/1975 Gia Lai 3245645 b@gmail.com
3 Nguyễn Thị Huyền Nữ 04/09/1999 Đồng Nai 914898989 huyen@gmail.com
dữ liệu e load lên như vậy. Có sai ở đâu không thầy? trên này gửi được hình không em chụp màn hình gửi thầy ạ
Em có thể chụp ảnh, gửi code lên google drive và share email: timodayedu@gmail.com, tối về mình xem cho
Chào bạn Tuấn.
Code Trên không sai mà là bạn chưa bỏ tích Ô (Enable Adding trong DataGridView).
Cảm ơn bạn nhiều nha. Respect. Cộng động IT cần những người như bạn và anh Tiến
lúc e chạy code nó báo lỗi tại
foreach (DataGridViewRow row in dgrid_bill.Rows)
{
foreach (DataGridViewCell cell in row.Cells)
{
pdfTable.AddCell(cell.Value.ToString());
}
}
ko biết tại sao ạ