minhquankq Mod
Tổng số bài gửi : 101 Join date : 05/01/2011 Age : 32 Đến từ : Đại học cần thơ
| |
hhdang Thành viên nhiệt tình
Tổng số bài gửi : 29 Join date : 04/01/2011 Age : 33 Đến từ : sóc trăng
| Tiêu đề: Re: [Thắc mắc] - Ứng dụng .NET để tạo báo cáo dữ liệu bằng Excel? Wed Feb 01, 2012 9:16 am | |
| - minhquankq đã viết:
- Tôi có một vấn đề mong nhận được sự giúp đỡ từ mọi người.
Tình hình là tôi muốn làm một chương trình viết bằng C# để tạo báo cáo ra file excel có sẳn. Cụ thể: Người dùng sẽ tạo sẽ một file báo cáo mẩu bằng excel (như một template), sao đó vào chương trình chọn template đó để đỗ dữ liệu vào file excel theo mẩu. Vị trí để đỗ vào như thế nào sẽ được chỉ ra trong file excel theo một số cú pháp nào đó.
Không biết mọi người có tài liệu tham khảo nào về một vấn đề như vậy không có thể chia sẽ với.
Cám ơn rất nhiều! Tôi chưa hiểu ý tưởng của bạn, nhưng tui biết nếu muốn xuất dữ liệu ra file excel thì bạn dùng Excel spreadsheets là dễ nhất.
Nếu bạn đã hiểu được Excel spreadsheets thì bạn có thể tạo ra các thủ tục xuất dữ liệu theo mẫu của bạn.
Excel spreadsheets là 1 định của excel. Bản thân của nó là xml. Vì là xml nên chúng ta muốn xuất dữ liệu ra file thì chỉ đơn giản là viết file text mà thôi, nhưng mà lúc đặt tên file cho nó thì có đuôi là xls để hệ thống kích hoạt excel khi mở file này.
Đoạn code này tui viết trong chương trình của tui dùng để xuất dữ liệu từ 1 datatable. Tham số thứ nhất là datatable chứa dữ liệu, tham số thứ 2 là file name, tham số thứ 3 là mảng các string header của cột, tham số thứ 4 là mảng các độ rộng cột, tham số thứ 5 là tiêu đề của file,tham số thứ 6 là mảng các tiêu đề phụ. - Code:
-
static public void exportToExcel(System.Data.DataTable sourceTable, string filename, string[] hearder, int[] with, string title,string []subtitle) { if (sourceTable.Columns.Count > 256 || sourceTable.Rows.Count > 65536) return; if (sourceTable.Columns.Count != hearder.Length) return; if (sourceTable.Columns.Count != with.Length) return; TextWriter tw = new StreamWriter(filename); //header string xml = "<?xml version=\"1.0\"?>\r\n"; //element root xml += "<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n" + "xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\n" + "xmlns:x=\"urn:schemas-microsoft-com:office:excel\"\r\n" + "xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">\r\n"; //Styles xml += "<Styles>\r\n"; xml += "<Style ss:ID=\"Default\" ss:Name=\"Normal\">\r\n" + "<Alignment ss:Vertical=\"Bottom\"/>\r\n" + "<Borders/>\r\n" + "<Font/>\r\n" + "<Interior/>\r\n" + "<NumberFormat/>\r\n" + "<Protection/>\r\n" + "</Style>\r\n"; xml += "<Style ss:ID=\"BoldColumn\">\r\n<Alignment ss:Horizontal=\"Center\" ss:Vertical=\"Bottom\"/>\r\n<Font x:Family=\"Swiss\" ss:Bold=\"1\"/>\r\n</Style>\r\n"; xml += "<Style ss:ID=\"Title\">\r\n<Alignment ss:Horizontal=\"Center\" ss:Vertical=\"Bottom\"/>\r\n<Font x:Family=\"Swiss\" ss:Bold=\"1\" ss:Size=\"20\"/>\r\n</Style>\r\n"; xml += "<Style ss:ID=\"StringLiteral\">\r\n <NumberFormat ss:Format=\"@\"/>\r\n </Style>\r\n"; xml += "<Style ss:ID=\"Decimal\">\r\n <NumberFormat />\r\n </Style>\r\n"; xml += "<Style ss:ID=\"Integer\">\r\n <NumberFormat />\r\n </Style>\r\n"; xml += "<Style ss:ID=\"DateLiteral\">\r\n <NumberFormat ss:Format=\"mm/dd/yyyy;@\"/>\r\n </Style>\r\n"; xml += "</Styles>\r\n"; //worksheet xml += "<Worksheet ss:Name=\"Sheet1\">\r\n"; //table xml += "<Table>\r\n"; //Column for (int x = 0; x < sourceTable.Columns.Count; x++) { xml += "<Column ss:Width=\"" + with[x] * 10 + "\"/>\r\n"; }
xml += "<Row>\r\n"; //title string me = ""; if (sourceTable.Columns.Count > 1) me = "ss:MergeAcross=\"" + (sourceTable.Columns.Count - 1) + "\""; xml += "<Cell " + me + " ss:StyleID=\"Title\"><Data ss:Type=\"String\">"; xml += title; xml += "</Data></Cell>\r\n"; xml += "</Row>\r\n";
if(subtitle!=null) for (int i = 0; i < subtitle.Length; i++) { xml += "<Row>\r\n"; //title xml += "<Cell " + me + " ss:StyleID=\"BoldColumn\"><Data ss:Type=\"String\">"; xml += subtitle[i]; xml += "</Data></Cell>\r\n"; xml += "</Row>\r\n"; }
xml += "<Row>\r\n"; xml += "</Row>\r\n"; xml += "<Row>\r\n"; for (int x = 0; x < sourceTable.Columns.Count; x++) { xml += "<Cell ss:StyleID=\"BoldColumn\"><Data ss:Type=\"String\">"; xml += hearder[x]; xml += "</Data></Cell>\r\n"; } xml += "</Row>\r\n";
foreach (DataRow x in sourceTable.Rows) { xml += "<Row>\r\n"; for (int y = 0; y < sourceTable.Columns.Count; y++) { System.Type rowType; rowType = x[y].GetType(); switch (rowType.ToString()) { case "System.String": string XMLstring = x[y].ToString(); XMLstring = XMLstring.Trim(); XMLstring = XMLstring.Replace("&", "&"); XMLstring = XMLstring.Replace(">", ">"); XMLstring = XMLstring.Replace("<", "<"); xml += "<Cell ss:StyleID=\"StringLiteral\">" + "<Data ss:Type=\"String\">"; xml += XMLstring; xml += "</Data></Cell>"; break; case "System.DateTime": DateTime XMLDate = (DateTime)x[y]; string XMLDatetoString = ""; //Excel Converted Date XMLDatetoString = XMLDate.Year.ToString() + "-" + (XMLDate.Month < 10 ? "0" + XMLDate.Month.ToString() : XMLDate.Month.ToString()) + "-" + (XMLDate.Day < 10 ? "0" + XMLDate.Day.ToString() : XMLDate.Day.ToString()) + "T" + (XMLDate.Hour < 10 ? "0" + XMLDate.Hour.ToString() : XMLDate.Hour.ToString()) + ":" + (XMLDate.Minute < 10 ? "0" + XMLDate.Minute.ToString() : XMLDate.Minute.ToString()) + ":" + (XMLDate.Second < 10 ? "0" + XMLDate.Second.ToString() : XMLDate.Second.ToString()) + ".000"; xml += "<Cell ss:StyleID=\"DateLiteral\">" + "<Data ss:Type=\"DateTime\">"; xml += XMLDatetoString; xml += "</Data></Cell>"; break; case "System.Boolean": xml += "<Cell ss:StyleID=\"StringLiteral\">" + "<Data ss:Type=\"String\">"; xml += x[y].ToString(); xml += "</Data></Cell>"; break; case "System.Int16": case "System.Int32": case "System.Int64": case "System.Byte": xml += "<Cell ss:StyleID=\"Integer\">" + "<Data ss:Type=\"Number\">"; xml += x[y].ToString(); xml += "</Data></Cell>"; break; case "System.Decimal": case "System.Double": xml += "<Cell ss:StyleID=\"Decimal\">" + "<Data ss:Type=\"Number\">"; xml += x[y].ToString(); xml += "</Data></Cell>"; break; case "System.DBNull": xml += "<Cell ss:StyleID=\"StringLiteral\">" + "<Data ss:Type=\"String\">"; xml += ""; xml += "</Data></Cell>"; break; default: throw (new Exception(rowType.ToString() + " not handled.")); } } xml += "</Row>\r\n"; }
xml += "</Table>\r\n"; xml += "</Worksheet>\r\n"; xml += "</Workbook>\r\n"; tw.WriteLine(xml); tw.Close(); } Đây là thủ tục xử lý công việc xuất danh sách hàng hóa trong ứng dụng của tui. - Code:
-
private void btn_excel_Click(object sender, EventArgs e) { SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "(*.xls)|*.xls"; DataTable tb = new DataTable(); saveFileDialog1.FileName = "hanghoa"; try { btn_tim_Click(null, null); if (saveFileDialog1.ShowDialog() == DialogResult.OK) { string[] header = new string[dataGridViewX1.Columns.Count]; for (int i = 0; i < dataGridViewX1.Columns.Count; i++) header[i] = dataGridViewX1.Columns[i].HeaderText; int[] w ={ 5, 30, 9, 9, 9 ,9}; if (saveFileDialog1.CheckFileExists == true) System.IO.File.Delete(saveFileDialog1.FileName); [You must be registered and logged in to see this link.] saveFileDialog1.FileName); QLBH.Class.excel.exportToExcel((DataTable)dataGridViewX1.DataSource, saveFileDialog1.FileName, header, w, "Danh Sách Hàng Hóa", null); System.Diagnostics.Process.Start(saveFileDialog1.FileName); } } catch (Exception ex) { MessageBox.Show(ex.Message); MessageBox.Show("Có thể trong table có dữ liệu đa phương tiện"); } finally { mysql.con.Close(); } } | |
|
minhquankq Mod
Tổng số bài gửi : 101 Join date : 05/01/2011 Age : 32 Đến từ : Đại học cần thơ
| Tiêu đề: Re: [Thắc mắc] - Ứng dụng .NET để tạo báo cáo dữ liệu bằng Excel? Wed Feb 01, 2012 12:41 pm | |
| Cám ơn huynh... Nhưng cái này là đưa dữ liệu của nguyên một bảng trong DB vào excel. Nhưng ý e muốn là đưa những cái cần. Mục đích của cái này là e làm báo cáo. ví dụ như chổ ô a1 e để tên là họ tên nhân viên, thì ở ô b1 sẽ để một công thức gì đó để khi chương trình mình chạy thì sẽ dự vào công thức đó mà lấy nhân viên phù hợp đưa vào cho ô đó. | |
|
Mr.Pakapun Mod
Tổng số bài gửi : 256 Join date : 25/02/2011 Age : 32 Đến từ : CTU
| Tiêu đề: Re: [Thắc mắc] - Ứng dụng .NET để tạo báo cáo dữ liệu bằng Excel? Wed Feb 01, 2012 8:49 pm | |
| vẫn chưa hiểu gì hết....hixx | |
|
minhquankq Mod
Tổng số bài gửi : 101 Join date : 05/01/2011 Age : 32 Đến từ : Đại học cần thơ
| Tiêu đề: Re: [Thắc mắc] - Ứng dụng .NET để tạo báo cáo dữ liệu bằng Excel? Thu Feb 02, 2012 11:03 am | |
| =((.. J mà hồi sáng không nói, để nói cho nghe để có biết chỉ zj.. | |
|
Sponsored content
| Tiêu đề: Re: [Thắc mắc] - Ứng dụng .NET để tạo báo cáo dữ liệu bằng Excel? | |
| |
|