27/1/14

Xuất file word trong C#

Bài viết này nhằm send cho những người bạn đang mò làm các in báo cáo dạng word trong c#. Ngoài ra các bạn đang và sẽ làm phần mềm bài tập lớn hay j j đó có thể tham khảo thêm



- Lưu ý: mình sử dụng Linq lên nhìu điểm mình sẽ chỉ cho các bạn biết các tùy biến đối với bài của các bạn

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

Xuất file word trong C#

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
              {
  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

Xuất file word trong C#

Xuất file word trong C#


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.
- Còn bảng thì các bạn tạo thông thường.
- Sau khi xong thì hãy lưu dạng Template

Xuất file word trong C#


- Ví dụ mình có báo cáo mẫu sau:
Xuất file word trong C#

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
            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

Xuất file word trong C#


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!

6 nhận xét:

  1. 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?
    Mong bạn sớm trả lời

    Mình dùng asp.net

    Trả lờiXóa
    Trả lời
    1. Chào bạn Nặc danh cũng như bạn Hung Nguyen!
      Qua 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!

      Xóa
  2. 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?
    Cảm ơn bạn.

    Trả lờiXóa
    Trả lời
    1. Cảm ơn bạn có câu hỏi rất hay!
      - 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

      Xóa
  3. Bạn up lại file run được không bạn?

    Trả lờiXóa
    Trả lời
    1. Mình fix và upload lại file rồi bạn nhé. May mail mình vẫn còn 1 bản share!
      Cảm ơn bạn ủng hộ blog của mình

      Xóa

Kích! Trở Về Đầu Trang