【WinForm】杂记(3):C#通过Excel打开和保存DataTable数据
2021-01-21 10:15
标签:依据 ESS ola arp 原来 style microsoft ext ber 命名空间 输入变量 数据表DataTable存入到DataSet中 读取的时候用 代码如下 整体的思路是 首先是新建变量Application→Workbook→Sheet。这里要注意原文第13-15行代码我是想并入$add datatable$中的。但是发现在第34行的位置,会影响顺序。原因是每次新加入表格,但是在原来表格之前插入的新表,因此itb+1(Excel中起始的索引是1而不是0)指向的表格永远都是后数第二张表格(创建Workbook时就有一张表)。因此第13-15行代码不能删掉。 然后是读入数据部分(第20-31行),有两点要注意。 再是根据数组的大小划定区域(第28-46行)。注意到Excel表的区域划定格式是“Ax:By”,其中冒号前面是左上角单元格位置,冒号后面是右下角单元格位置,这里默认是从最左上角的单元格(A1)开始。如此一来就张开了一个矩形区域作为xlRang。格式中的x和y代表的都是行索引(从1开始,参见第45行代码),字母代表列索引。注意到当字母表元素不够时,是通过叠加来增加的。如Z列之后是“AB,AC,...,AZ,BA,BC,....”,所以需要判断数据的列与字母表个数的关系,作为是否增加、以及增加到多少的依据: 若numsOfloop不等于0,则说明需要增加、并作为右下角列的前置字母;反之则不需要、取值为null即不需要前置字母。 之后再判断后置字母即可,再跟上数组的行数作为右下角的单元格位置(第45行) 最后就是将数组的数据赋值给xlRange(第49行) 特别要注意的是,千万不要忘记关闭进程(第60行)。 【WinForm】杂记(3):C#通过Excel打开和保存DataTable数据 标签:依据 ESS ola arp 原来 style microsoft ext ber 原文地址:https://www.cnblogs.com/RicardoIsLearning/p/12111040.htmlusing Microsoft.Office.Interop.Excel;
DataSet.Tables.Add(DataTable);
DataTable = DataSet.Table[i]
1 private bool DataTable2Excel(System.Data.DataSet ds, string[] sheet_names, string file_name)
2 {
3 Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
4 if (xlApp == null) {
5 //MessageBox.show("There is no excel!");
6 return false;
7 }
8 xlApp.Visible = true;
9 Microsoft.Office.Interop.Excel.Workbooks xlBooks = xlApp.Workbooks;
10 Microsoft.Office.Interop.Excel.Workbook xlBook = xlBooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
11
12 //add sheet
13 for (int itb = 1; itb //there has one sheet, so it should add one less sheet
14 xlBook.Sheets.Add();
15 }
16
17 //add datatable
18 for (int itb = 0; itb ) {
19
20 //convert values of datatable into an array
21 object[,] objData = new object[ds.Tables[itb].Rows.Count + 1, ds.Tables[itb].Columns.Count];//remain the first row for the col name
22 //add column name
23 for (int icol = 0; icol ) {
24 objData[0, icol] = ds.Tables[itb].Columns[icol].ColumnName;
25 }
26 //add data
27 for (int irow = 0; irow ) {
28 for (int icol = 0; icol ) {
29 objData[irow + 1, icol] = ds.Tables[itb].Rows[irow][icol];
30 }
31 }
32
33 //generate xlSheet
34 Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBook.Worksheets[itb + 1];
35 xlSheet.Name = sheet_names[itb];
36 try {
37 //get range and fill data
38 //1.set excel column name
39 string startCol = "A";
40 int numsOfloop = (ds.Tables[itb].Columns.Count / 26);
41 string endCol_start = (numsOfloop == 0 ? "" : ((char)(‘A‘ + (numsOfloop - 1))).ToString());
42 string endCol = endCol_start + ((char)(‘A‘ + ds.Tables[itb].Columns.Count - numsOfloop * 26 - 1)).ToString();
43 //2.generate range
44 Microsoft.Office.Interop.Excel.Range xlRange = xlSheet.get_Range(
45 startCol + "1", endCol + (ds.Tables[itb].Rows.Count + 1).ToString()
46 );//- iCnt * 26
47 //3.fill the data into the range
48 xlRange.NumberFormatLocal = "@";
49 xlRange.Value = objData;
50 xlRange.EntireColumn.AutoFit(); //column rang is set as auto
51 xlSheet.get_Range(startCol + "1", endCol + (ds.Tables[itb].Rows.Count + 1)).Font.Name = "Consolas";
52 } catch {
53 this.textBox1.Text += sheet_names[itb] + "\r\n";
54 }
55 }
56
57 xlApp.DisplayAlerts = false;
58 xlApp.AlertBeforeOverwriting = false;
59 xlBook.SaveAs(file_name);
60 xlApp.Quit();
61
62 return true;
63 }
int numsOfloop = (ds.Tables[itb].Columns.Count / 26);
string endCol_start = (numsOfloop == 0 ? "" : ((char)(‘A‘ + (numsOfloop - 1))).ToString());
上一篇:API使用
文章标题:【WinForm】杂记(3):C#通过Excel打开和保存DataTable数据
文章链接:http://soscw.com/index.php/essay/44950.html