隐藏

C# 中把DataTable中数据导出Excel编程实例

发布:2014/6/16 16:16:36作者:管理员 来源:本站 浏览次数:1537

目前有个项目,客户需求是要把数据倒成Excel,找了点资料整理了一番。决定写一片这样的文章,第一给自己也是一种巩固,第二给需要的人也是一种帮助。

(1)首先:添加一个为程序添加一个引用

(2)在程序中using一下

using Excel = Microsoft.Office.Interop.Excel;using System.Reflection;

(3)给你的程序中添加一个模板Excle(一个空的Excle文件就行)

这里就起一个名字:temp.xls

(4)按照三层架构的思想,以下有2个方法写在中间层。

第一个方法SCexcle()有2个参数,①把你需要导入 Excle的数据集 定义到一个DataTable中,②指向你程序里面前面定义的 temp.xls 模板excel的路径

1 Excel.Application app;
2 Excel._Workbook wbook;
3 Excel._Worksheet oSheet;

5     public string SCexcel(DataTable dt, string pathLong)
6         {
7            string wordPath = pathDownLoad + “temp.xls”; //定义模板的路径
8            //打开excel文档
9            app = new Excel.Application();//添加一个 Excle应用对象
10 
11            //打开工作簿,可见很多参数,第一个就是我们模板的路径。
12             wbook = app.Workbooks.Open(wordPath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,                Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
13 
14 
15             oSheet = (Excel._Worksheet)wbook.Worksheets[1];//创建一张sheet表
16 
17             //定义文件保存路径
18               string filename1 = "report" + System.DateTime.Now.Year + System.DateTime.Now.Month + savechinese + ".xls";//因为保存的不平凡,所以之精确到年和月                  。否则就保存到毫秒
19               string filename2 = pathLong + "UpLoadFiles\\" + filename1;//保存在服务器的路径
20 
21               addExecl(filename2.ToString(), dt);//内部的一个方法,把服务器路径与之前的数据放入addExcle()中,目的是在把数据放入Excel中
22 
23              //打开后就要关闭。O(∩_∩)O~
24 
25              app.Workbooks.Close();
26               //同样不要忘记结束进程
27              System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet);
28              System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
29 
30              GC.Collect();//强制对所有代进行即时垃圾回收
31 
32    }

第二个方法addExecl();我们来看看他是如何处理数据的,并且使用你自己想要的格式来定义Excel

1        private void addExecl(string xlsPath, DataTable dt)
2         {
3              4            
5             Excel.Range oRng;
6             Excel.Range range;


9             //标题
10             int excel_cur = 1;
11             oSheet.Cells[excel_cur, 1] = "大标题";
12             excel_cur++;
13 
14             //字段名           
15             oSheet.Cells[excel_cur, 1] = "序号";
16             oSheet.Cells[excel_cur, 2] = "字段1";
17             oSheet.Cells[excel_cur, 3] = "字段2";
18             oSheet.Cells[excel_cur, 4] = "字段3";
19             oSheet.Cells[excel_cur, 5] = "字段4";
20             oSheet.Cells[excel_cur, 6] = "字段5";
21             oSheet.Cells[excel_cur, 7] = "字段6";
22             oSheet.Cells[excel_cur, 8] = "字段7";
23             oSheet.Cells[excel_cur, 9] = "字段8";
24             oSheet.Cells[excel_cur, 10] = "字段9";
25             excel_cur++;
26 
27             //行数据绑定
28             if (dt.Rows.Count > 0)
29             {
30                 for (int i = 0; i < dt.Rows.Count; i++)
31                 {
32                     oSheet.Cells[excel_cur, 1] = dt.Rows[i][0].ToString();
33                     oSheet.Cells[excel_cur, 2] = dt.Rows[i][1].ToString();
34                     oSheet.Cells[excel_cur, 3] = dt.Rows[i][2].ToString();
35                     oSheet.Cells[excel_cur, 4] = dt.Rows[i][3].ToString();
36                     oSheet.Cells[excel_cur, 5] = dt.Rows[i][4].ToString();
37                     oSheet.Cells[excel_cur, 6] = dt.Rows[i][5].ToString();
38                     oSheet.Cells[excel_cur, 7] = dt.Rows[i][6].ToString();
39                     oSheet.Cells[excel_cur, 8] = dt.Rows[i][7].ToString();
40                     oSheet.Cells[excel_cur, 9] = dt.Rows[i][8].ToString();
41                     oSheet.Cells[excel_cur, 10] = dt.Rows[i][9].ToString();
42                     excel_cur++;
43 
44                 }
45             }
46             //格式定义
47             range = (Excel.Range)oSheet.get_Range("A1", "J1");//选中 A1:J1 单元格
48             range.Merge(0);//合并单元格
49             range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;//纵向居中 
50             range.HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;//横向居中
51             range.Font.Size = 18;
52             range.Font.Name = "黑体";
53             range.RowHeight = 24;
54 
55             oRng = oSheet.get_Range("A2", "J" + Convert.ToString(dt.Rows.Count + 2));
56             oRng.Borders.LineStyle = 1;
57             oRng.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;//居中
58             oRng.HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;
59             oRng.EntireColumn.AutoFit();//列宽自动  
60 
61             app.Application.DisplayAlerts = false;
62             oSheet.SaveAs(xlsPath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,               Missing.Value);//文件保存
63         }

其实还有很多对Excel进行的样式设置,见下面这个表:               

Excel.Application eole = new Excel.Application();
效果 具体代码
添加新工作簿 eole.Workbooks.add
激活指定的工作簿 eole.WorkSheets("工作簿名").Activate
设置第3个工作表为激活工作表 eole.Worksheets("sheet1").Activate
打开指定工作簿 eole.Workbooks.add("E:/E_temp/ABC.xls")
更改Excel标题栏 eole.Caption="Microsoft Excel"
给单元格赋值 eole.cells(行,列).value=XM(XM为数据库字段名)
eole.cells(1,4).value='ASDFASDFASDFASDFADSF'
设置指定列的宽度(单位:字符个数) eole.ActiveSheet.Columns(1).ColumnWidth=5
设置指定行的高度(单位:磅) eole.ActiveSheet.Rows(1).RowHeight=1/0.035  //设定行高为1厘米,1磅=0.035厘米
在第7行之前插入分页符 eole.Worksheets("Sheet1").Rows(7).PageBreak=1
在第7列之前删除分页符 eole.ActiveSheet.Columns(7).PageBreak=0
指定边框线宽度(Borders参数如下) eole.ActiveSheet.Range("b3:d3").Borders(2).Weight=3
设置四个边框线条的类型

eole.ActiveSheet.Range("b3:d3").Borders(1).LineStyle=1 
(其中Borders参数:1-左、2-右、3-顶、4-底、5-斜、6-斜/;LineStyle
值:1与7-细实、2-细虚、4-点虚、9-双细实线)
设置页眉 eole.ActiveSheet.PageSetup.CenterHeader="报表1"
设置页脚 eole.ActiveSheet.PageSetup.CenterFooter="第&P页"
设置页眉到顶端边距为2厘米 eole.ActiveSheet.PageSetup.HeaderMargin=2/0.035
设置页脚到底边距为3厘米 eole.ActiveSheet.PageSetup.FooterMargin=3/0.035
设置顶边距为2厘米 eole.ActiveSheet.PageSetup.TopMargin=2/0.035
设置底边距为4厘米 eole.ActiveSheet.PageSetup.BottomMargin=4/0.035
设置左边距为2厘米 eole.ActiveSheet.PageSetup.LeftMargin=2/0.035
设置右边距为2厘米 eole.ActiveSheet.PageSetup.RightMargin=2/0.035
设置页面水平居中 eole.ActiveSheet.PageSetup.CenterHorizontally=.t.
设置页面垂直居中 eole.ActiveSheet.PageSetup.CenterVertically=.t.
设置页面纸张大小(1-窄行8?5?11 39-宽行14?11) eole.ActiveSheet.PageSetup.PaperSize=1
可为下列 XlPaperSize 常量之一(某些打印机可能不支持所有的这些纸张大小);
常量 数值 意义;
xlPaperLetter 1 Letter (8-1/2 in. x 11 in.) 
xlPaperA3 8 A3 (297 mm x 420 mm) 
xlPaperA4 9 A4 (210 mm x 297 mm) 
xlPaperA4Small 10 A4 Small (210 mm x 297 mm) 
xlPaperA5 11 A5 (148 mm x 210 mm) 
xlPaperB4 12 B4 (250 mm x 354 mm) 
xlPaperB5 13 B5 (182 mm x 257 mm) 
xlPaperFanfoldUS 39 U.S. Standard Fanfold (14-7/8 in. x 11 in.) 
xlPaperUser 用户自定义
打印单元格网线 eole.ActiveSheet.PageSetup.PrintGridlines=.t.
拷贝整个工作簿 eole.ActiveSheet.UsedRange.Copy
拷贝指定区域 eole.ActiveSheet.Range("A1:E2").Copy
粘贴 eole.Worksheets("sheet2").Activate 
eole.ActiveSheet.Range("F1").PasteSpecial
在第2行之前插入一行 eole.ActiveSheet.Rows(2).Insert
在第2列之前插入一列 eole.ActiveSheet.Columns(2).Insert
设置字体 eole.ActiveSheet.Cells(2,1).Font.Name="黑体"
设置字体大小 eole.ActiveSheet.Cells(1,1).Font.Size=25
设置字体为斜体 eole.ActiveSheet.Cells(1,1).Font.Italic=.t.
设置整列字体为粗体 eole.ActiveSheet.Columns(1).Font.Bold=.t.
合并单元格 eole.ActiveSheet.Range("A1:B4").merge 
撤销合并单元格,上述操作的逆操作 eole.ActiveSheet.Range("A1:B4").unmerge
在单元格中设置公式(一般可以用来实现计算汇总、求平均等很多功能) eole.cells(1,4).value = "=公式"
** 可以使用所有VBA内部函数,如sum()等。注意:不能使用VFP的函数啊!
清除单元格公式 eole.ActiveSheet.Cells(1,4).ClearContents
打印预览工作表 eole.ActiveSheet.PrintPreview
打印输出工作表 eole.ActiveSheet.PrintOut
工作表另为 eole.ActiveWorkbook.SaveAs("c:/temp/22.xls")
放弃存盘 eole.ActiveWorkbook.saved=.t.
关闭工作簿 eole.Workbooks.close 
退出Excel eole.quit 

以上就是本人对Excel一些微不足道的见解。写的不周到的地方 也请给位多多担待。