使用OpenXML將數據導入到Excel模板中


前言

之前文章中簡單的介紹過將數據導入到excel中,在日常的工作的很多時候其實我們是需要將數據導入到指定的模板的。其實將數據導入到模板和將數據導入到新的Excel模板中沒有多大的區別。本文主要介紹導入到模板應該注意的一些地方。

准備工作

1.Excel模板如下:

image

2.openxml相關類庫:

image

3.控制台或者winform程序

注意事項

1.因為是導入到現有Excel模板,所以使用SpreadsheetDocument.Open(filePath, true)打開Excel文檔;

1 using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, true))
2 {
3 //TODO:
4 }

2.插入數據前需要先獲取待插入Excel的WorksheetPart,SheetData,以獲取當前Excel中的行信息和插入數據用;

1 WorkbookPart workbook = document.WorkbookPart;
2
3 WorksheetPart worksheet = workbook.WorksheetParts.Last();
4
5 SheetData sheetData = worksheet.Worksheet.GetFirstChild<SheetData>();
6
7 Sheets sheets = workbook.Workbook.Sheets;

3.獲取數據行的樣式索引(StyleIndex),使得新添加行的樣式能夠匹配已有數據行樣式(下面代碼僅為示意);

1 //記錄第二行樣式
2 IEnumerable<Row> excelRows = worksheet.Worksheet.Descendants<Row>();
3
4 Row firstRow = excelRows.FirstOrDefault(r => r.RowIndex == 2);
5
6 UInt32 styleIndex = firstRow.RowIndex;


4.由於DataTable中數據列和表格中列不一定統一,這里就需要采取一定措施使得插入數據的正確性。本人采取的是比較笨得方式,定義一個同模板列順序一致的枚舉(枚舉出所有的列名,列名是dataTable中的列名,枚舉值是模板中列的單元格列索引)。根據枚舉值獲取待插入Cell,然后向指定Cell中插入數據;

如:DataTable的列為:ItemNo,ItemDesc,PCS,GrossWT,Height,Length,Width,Package,ChargeWT,Fee

則定義枚舉以對應導出的列:

 1     public enum TestTemplateColumn
2 {
3 ItemNo,
4 ItemDesc,
5 PCS,
6 GrossWT,
7 Length,
8 Width,
9 Height,
10 ChargeWT,
11 Fee,
12 Package
13 }

5.創建Row時RowIndex注意不能重復,否則文檔出錯。另外,新創建的Row一定要添加到SheetData中 ,否則數據不會保存到Excel中;

1 Row row = excelRows.FirstOrDefault(r => r.RowIndex == rowIndex + 3);
2
3 if (row == null)
4 {
5 row = new Row();
6 row.RowIndex = (UInt32)rowIndex + 3;//第一行,第二行為標題行
7 sheetData.AppendChild(row);
8 }


6.如果需要也可以修改Excel的SheetName,如將”Sheet1”修改為“Test”

1 Sheets sheets = workbook.Workbook.Sheets;
2
3 Sheet sheet = sheets.GetFirstChild<Sheet>();
4
5 sheet.Name = "Test";

 

上述注意事項,是在使用OpenXML將DataTable數據導入到模板中, 總結出來的,不一定很全,還望補充。

 

(部分示例代碼如下)

View Code
 1  private void InsertDataToExcel(DataTable dt, string filePath,string sheetName)
2 {
3 using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, true))
4 {
5 WorkbookPart workbook = document.WorkbookPart;
6 WorksheetPart worksheet = workbook.WorksheetParts.Last();
7 SheetData sheetData = worksheet.Worksheet.GetFirstChild<SheetData>();
8
9 Sheets sheets = workbook.Workbook.Sheets;
10 Sheet sheet = sheets.GetFirstChild<Sheet>();
11
12 if (string.IsNullOrEmpty(sheetName))
13 {
14 sheet.Name = sheetName;
15 }
16
17 IEnumerable<Row> excelRows = worksheet.Worksheet.Descendants<Row>();
18
19 Row firstRow = excelRows.FirstOrDefault(r => r.RowIndex == 2);
20 IEnumerable<Cell> firstCells = firstRow.Descendants<Cell>();
21
22 UInt32 styleIndex = 0;
23 for(int rowIndex =0;rowIndex< dt.Rows.Count;rowIndex++)
24 {
25 Row row = excelRows.FirstOrDefault(r => r.RowIndex == rowIndex + 3);
26
27 if (row == null)
28 {
29 row = new Row();
30 row.RowIndex = (UInt32)rowIndex + 3;//第一行,第二行為標題行
31 sheetData.AppendChild(row);
32 }
33
34 IEnumerable<Cell> cells = row.Descendants<Cell>();
35
36 //具體插入代碼省略了主要兩步
37
38 //1. 先獲取單元格
39
40 //2 .將數據插入單元格中
41 }
42 }
43 }
44
45
46 private Cell GetCell(RateColumn column, Row row, IEnumerable<Cell> cells)
47 {
48 Cell cell = null;
49 string cellRef = GetCellReference((int)column+1) + row.RowIndex;
50 cell = cells.FirstOrDefault(cel => cel.CellReference == cellRef);
51 return cell;
52 }
53
54 private void InsertCell(RateColumn column, Row row, object value, Cell cell,uint? styleIndex)
55 {
56 string strValue = value == null ? string.Empty : value.ToString();
57 int rowIndex = int.Parse(row.RowIndex.ToString());
58 if (cell == null)
59 {
60 double val = 0;
61 if (double.TryParse(strValue, out val))
62 {
63 cell = CreateValueCell((int)column, rowIndex, val, styleIndex);
64 }
65 else
66 {
67 cell = CreateTextCell((int)column, rowIndex, strValue, styleIndex);
68 }
69 row.AppendChild(cell);
70 }
71 else
72 {
73 double val = 0;
74 if (double.TryParse(strValue, out val))
75 {
76 cell.CellValue = new CellValue();
77 cell.CellValue.Text = strValue;
78 }
79 else
80 {
81 InlineString inlineString = new InlineString();
82 Text t = new Text();
83 t.Text = strValue;
84 cell.DataType = CellValues.InlineString;
85 cell.InlineString = inlineString;
86 cell.InlineString.Text = t;
87 }
88 }
89 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM