Phần 1: Tạo file WordUltil.cs
- Mục đích với một dự án lớn các bạn chỉ cần gọi hàm không cần code lại làm j
Mình để cái file WordUltil.cs trong thư mục ClassXuLy
code của file đó như sau:
using System;
using System.Collections.Generic;
using Word = Microsoft.Office.Interop.Word;
using System.Data;
using System.Data.OleDb;
namespace DeMoDichKen.CoSoDuLieu
{
using System;
using System.Collections.Generic;
using Word = Microsoft.Office.Interop.Word;
using System.Data;
using System.Data.OleDb;
namespace DeMoDichKen.CoSoDuLieu
{
}class WordUltil
{
private Word.Application _app;
Word.Document _doc;
private object _pathFile;
public WordUltil(string vPath, bool vCreateApp)
{
_pathFile = vPath;
_app = new Word.Application();
_app.Visible = vCreateApp;
object ob = System.Reflection.Missing.Value;
_doc = _app.Documents.Add(ref _pathFile, ref ob, ref ob, ref ob);
}
public void WriteFields(Dictionary<string, string> vValues)
{
foreach (Word.Field field in _doc.Fields)
{
string fieldName = field.Code.Text.Substring(11, field.Code.Text.IndexOf("\\") - 12).Trim();
if (vValues.ContainsKey(fieldName))
{
field.Select();
_app.Selection.TypeText(vValues[fieldName]);
}
}
}
public void WriteTable(DataTable vDataTable, int vIndexTable)
{
Word.Table tbl = _doc.Tables[vIndexTable];
int lenrow = vDataTable.Rows.Count;
int lencol = vDataTable.Columns.Count;
for (int i = 0; i < lenrow; ++i)
{
object ob = System.Reflection.Missing.Value;
tbl.Rows.Add(ref ob);
for (int j = 0; j < lencol; ++j)
{
tbl.Cell(i + 2, j + 1).Range.Text = vDataTable.Rows[i][j].ToString();
}
}
}
}
Chú giải: hàm WriteFields mục dích là mình sẽ in các mục thông qua Filed trong word. Hàm WriteTable sẽ in ra bản dữ liệu.
Phần 2: Tạo file Temple cho báo cáo Word
- Các bạn vào Insert-> Quick Parts->Field
Tại mục Field name các bạn để những đoạn mình muốn xuất ra như ngày tháy năm hay các trường trong cơ sở dữ liệu.
- Ví dụ mình có báo cáo mẫu sau:
Phần 3: Chuẩn bị dữ liệu và in
- CSDL của mình trong phần này bao gồm 2 bảng ( nhưng chúng ta sử dụng View )
+ Bảng 1: KhenThuong
+ Bảng 2: ChiTietKhenThuong
Dữ liệu mình dùng sẽ là View của 2 bảng trên
+ View 1: vKhenThuong
+ View 1: vChiTietKhenThuong
- Sau khi đã tạo ra các View chúng ta đi đến viết code
1. Tại form bạn "using QuanLyBacSi.ClassXuLy;" // QuanLyBacSi là tên dự án của mình, ClassXuLy là thư mục mình để file WordUltil.cs
2. Tại nút bạn in sẽ đổ code như sau:
// lấy mã quyết định ra từ DataGridView
string maQuyetDinh = dgvQuyetDinhKhenThuong.CurrentRow.Cells["colMaQuyetDinh"].Value.ToString();
//lấy ra bảng khen thuong theo mã.
vKhenThuong khenThuong = _db.vKhenThuongs.Single(p => p.MaQuyetDinh == maQuyetDinh);
//lấy ra chi tiết khen thuong
var chiTietKhenThuongs = from ct in _db.vChiTietKhenThuongs
where ct.MaQuyetDinh == maQuyetDinh
select ct;
//chuyển đổi dữ liệu danh sách sang bảng. Lưu ý: View vChiTietKhenThuong là ở trong file DataSet có tên là Database.xsd
DataTable tblChiTietKhenThuong = new Database.vChiTietKhenThuongDataTable();
ConvertUltil.ToDataTableFromList<vChiTietKhenThuong>(chiTietKhenThuongs.ToList<vChiTietKhenThuong>(), ref tblChiTietKhenThuong);
tblChiTietKhenThuong.PrimaryKey = null;
tblChiTietKhenThuong.Columns.Remove("MaQuyetDinh");
//Tạo 1 biết tự tăng làm số thứ tự trong bảng
DataColumn col = new DataColumn("STT", typeof(int));
tblChiTietKhenThuong.Columns.Add(col);
col.SetOrdinal(0);
int len = tblChiTietKhenThuong.Rows.Count;
for (int i = 0; i < len; ++i)
{
tblChiTietKhenThuong.Rows[i]["STT"] = i + 1;
}
Dictionary<string, string> dic = new Dictionary<string, string>();
// Xuất các dữ liệu mình chuẩn bị ở Field (ở đây mình lọc lấy dữ liệu ở dạng linq)
dic.Add("Ngay", DateTime.Parse(khenThuong.NgayKy).Day.ToString());
dic.Add("Thang", DateTime.Parse(khenThuong.NgayKy).Month.ToString());
dic.Add("Nam", DateTime.Parse(khenThuong.NgayKy).Year.ToString());
dic.Add("MaQuyetDinh", khenThuong.MaQuyetDinh);
dic.Add("TenQuyetDinh", khenThuong.TenQuyetDinh);
dic.Add("TenHinhThuc", khenThuong.TenHinhThuc);
dic.Add("LyDo", khenThuong.LyDo);
dic.Add("TenChucVu", khenThuong.TenChucVu);
dic.Add("TenNguoiKy", khenThuong.TenNguoiKy);
// Đường dẫn file Template mình để, còn true là mở file word lên
// Đường dẫn file Template mình để, còn true là mở file word lên
WordUltil wd = new WordUltil(Application.StartupPath + "/Template/ChiTietKhenThuong.dotx", true);
// In các Field
wd.WriteFields(dic);
// In bảng Chi Tiết Khen Thưởng ( số 2 là thứ tự bảng mình muốn in, ở đây mình in là số 2 do bảng 1 mình làm căng chỉnh Tiêu Đề )
wd.WriteTable(tblChiTietKhenThuong, 2);
- Kết quả mình in được như sau
Do một số bạn hỏi demo nho nhỏ cho các bạn í, nguyên nhân là đọc không hiu, sau đây mình demo sản phẩm nhỏ bao gồm: đa ngôn ngữ, giải phương trình bậc 2 (viết dưới dạng class), đọc và ghi file *.txt (mục đích là giúp các bạn lấy và ghi chuỗi cho chuỗi connection khi viết ứng dụng kết nối csdl), xuất file word (do mình không có csdl đâm ra mình tạo tạm csdl thông qua datagridview, nghĩa là bạn thêm dữ liệu vào gridview xong ok nhấn nút in - dữ liệu được tạo tạm và lưu vào biến Datatable, từ biến này xuất ra word)
File code nguồn: http://www.fshare.vn/file/5L5ENNFAT7/
File Run : https://www.fshare.vn/file/7JS4UPREGSC2 ĐÃ FIX
Chúc các bạn thành công!
Nguồn: http://dichken.blogspot.com/
Config trên IIS ko chạy được,chạy = cổng của visual thì ok. Ko biết giải quyết vấn đề này ntn?
Trả lờiXóaMong bạn sớm trả lời
Mình dùng asp.net
Chào bạn Nặc danh cũng như bạn Hung Nguyen!
XóaQua tìm hiểu của mình cho thấy hầu như ít ai dùng word để xuất báo cáo, thay vì đó mọi người sử dụng Crystal hoặc dạng HTML và cho phép in. Bạn có thể tìm hiểu thêm cách thức xuất báo cáo đó xem thế nào. Chúc bạn thành công!
Chào bạn, cho mình hỏi khi mình dùng \n trong C# thì lúc xuất chuỗi có "\n" vào file word, word có xuống dòng ngay tại đó không?
Trả lờiXóaCảm ơn bạn.
Cảm ơn bạn có câu hỏi rất hay!
Xóa- Thứ nhất mình chỉ sử dụng ký tự đó để xuống dòng trong hộp thoại thông báo thôi
- Thứ hai mình chưa thử với nó trong Word, mình muốn thử và có đáp án cho bạn nhưng do máy mình không cài visual đâm ra mình không biết như thế nào cả, vậy mong bạn thông cảm cho mình nhé.
Có j bạn trực tiếp send mail ( mail của mình có ghi ở cuối blog) hay qua face cho mình ( chỉ cần gửi tin nhắn chứ không cần kết bạn cũng được mà - Facebook,com\DichKen
Bạn up lại file run được không bạn?
Trả lờiXóaMình fix và upload lại file rồi bạn nhé. May mail mình vẫn còn 1 bản share!
XóaCảm ơn bạn ủng hộ blog của mình