1. 程式人生 > >使用OpenXml操作Excel,實現導入DataTabel數據<一>

使用OpenXml操作Excel,實現導入DataTabel數據<一>

new 導出文件 nms tail tps 空間 elf sts reads

最近因公司需要一直在研究OpenXml,今天難得留出時間總結一下,以備後用。下面重點講述OpenXml在Excel中的應用,主要講的是將Xml文件中的數據轉換為DataTable,然後將DataTable的數據,導入Excel中,生成Excel電子表格。

先來了解一下OpenXml:

OpenXML(OOXML)是微軟在Office 2007中提出的一種新的文檔格式,Office 2007中的Word、Excel、PowerPoint默認均采用OpenXML格式 。

參考資料:可以通過下面網址去學習https://msdn.microsoft.com/zh-cn/ZH-Ch/libraty/office/cc850837.aspx

一>在介紹如何做之前,先做好準備工作:

1.下載OpenXMLSDKv2.msi,(下載地址:http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=5124)安裝一下OpenXMLSDKv2.msi

2.在項目中引用 DocumentFormat.OpenXml.dllWindowsBase.dll

二>計劃實現步驟:

第一步,創建Excel電子表格;

第二步,現將Xml中的數據封裝到一個DataTable中;

第三步,在Excel中去DataTable的列標題作為起始行數據,從第二行起顯示對應列標題的Value;

第四步,將圖片插入Excel中,合並單元格,設置單元格的樣式。

三>代碼塊實現

1.創建Excel電子表格,首先添加命名空間。

using System.IO;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.Data;

//創建電子表格

public sealed class XmlCreatExcel_en_US: ImportReportFromXml_en_US
{

public static WorksheetPart CurrentWorksheetPart { get; set; }

//這裏先自定義一個xmldataPath和xmldataPath

string xmldataPath = @"D:\Report\20180128_150438.xml";

string excelFilePath= @"C:\Users\admin\Desktop\導出文件\myCellEx01.xlsx";

public static void CreatExcel(string xmldataPath, string excelFilePath)
{
List<string> FilePath = new List<string>();

using (var workbook = SpreadsheetDocument.Create(excelFilePath, SpreadsheetDocumentType.Workbook))
{
// create the workbook
WorkbookPart workbookpart = workbook.AddWorkbookPart();
workbookpart.Workbook = new Workbook();
workbook.WorkbookPart.Workbook.Sheets = new Sheets();

uint sheetId = 1;

//將Xml中的字符串數組封裝到DataTable中
//設置列標題
var lists = new List<string[]>();
DataTable tblDatas = new DataTable();
DataTable[] dt = new DataTable[1] { tblDatas };
tblDatas.Columns.Add("No", typeof(Int32));
tblDatas.Columns[0].AutoIncrementSeed = 1;
tblDatas.Columns[0].AutoIncrementStep = 1;
tblDatas.Columns.Add("Dut Image", typeof(string));
tblDatas.Columns.Add("CImage", typeof(string));
tblDatas.Columns.Add("BrazedRatio", typeof(string));
DataRow dr;

for (int i = 0; i < dt.Length; i++)
{

ImportReportFromXml ReportXml = new ImportReportFromXml();
var list = ReportXml.GetExcelBottomData(xmldataPath);
lists.AddRange(list);
}
for (int k = 0; k < lists.Count; k++)//外循環:控制行數
{
dr = tblDatas.NewRow();
foreach (var RowArray in lists)//遍歷每行每列的內容
{
dr["No"] = lists[k][0];
dr["Dut Image"] = lists[k][1];
dr["CImage"] = lists[k][2];
dr["BrazedRatio"] = lists[k][3];
}
tblDatas.Rows.Add(dr);
}

//將DataTable中的數據插入到Excel中

foreach (DataTable table in dt)
{
CurrentWorksheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>();
CurrentWorksheetPart.Worksheet = new Worksheet();//創建工作表
//添加SheetStyle,下面會寫出來
WorkbookStylesPart stylesPart = workbookpart.AddNewPart<WorkbookStylesPart>();
stylesPart.Stylesheet = new Stylesheet();

var sheetData = new SheetData();//用來存儲數據的位置和內容

//設置Excel的列寬
Columns columns01 = new Columns();
columns01 = CrateColunms(table);
CurrentWorksheetPart.Worksheet.Append(columns01);


Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<Sheets>();
string relationshipId = workbook.WorkbookPart.GetIdOfPart(CurrentWorksheetPart);

if (sheets.Elements<Sheet>().Count() > 0)
{
sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
}
string sheetName = "Sheet01";
//創建工作薄,並設置其屬性之間的關系
Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };
sheets.Append(sheet);

//這句用於將數據填充到Worksheetpart中,非常重要,不可隨意挪動位置。
CurrentWorksheetPart.Worksheet.Append(sheetData);

//正式插入DataTable中的數據到Excel中

//creat HeaderRow
Row headerRow = new Row() { RowIndex = 13 };//設置為第13行為首行(可行),默認RowIndex=1
//創建列
List<String> columns = new List<string>();
foreach (DataColumn column in table.Columns) //外遍歷:控制列標題
{
string ColumnName = GetColumnName(columns.Count);
string rowRef = ColumnName + headerRow.RowIndex;
//增加列標題
columns.Add(column.ColumnName);
//創建單元格
Cell cell = new Cell() { CellReference = rowRef, StyleIndex = 3, DataType = CellValues.String, CellValue = new CellValue(column.ColumnName) };
headerRow.Append(cell);
}
sheetData.Append(headerRow); //添加到首行

//creat Columns
UInt32Value startRIndex = 14;
foreach (DataRow dsrow in table.Rows)
{
Row newRow = new Row() { RowIndex = startRIndex, Height = 207.00, CustomHeight = true };
startRIndex = startRIndex + 1;
foreach (string col in columns)
{
switch (col)
{
case "No":
Cell cell13 = new Cell() { StyleIndex = 3, DataType = CellValues.String, CellValue = new CellValue(dsrow[col].ToString()) };
newRow.Append(cell13);
break;
case "Dut Image":
Cell cell14 = new Cell() { StyleIndex = 3, DataType = CellValues.String, CellValue = new CellValue("") };
newRow.Append(cell14);
UInt32Value a = Convert.ToUInt32(newRow.InnerText);
InsertImage(105, 382 + (a - 1) * 276, dsrow[col].ToString());//圖片插入取的值是像素
break;
case "CImage":
Cell cell15 = new Cell() { StyleIndex = 3, DataType = CellValues.String, CellValue = new CellValue("") };
newRow.Append(cell15);
UInt32Value b = Convert.ToUInt32(newRow.InnerText);
InsertImage(393, 382 + (b - 1) * 276, dsrow[col].ToString());

break;
case "BrazedRatio":
Cell cell16 = new Cell() { StyleIndex = 3, DataType = CellValues.String, CellValue = new CellValue(dsrow[col].ToString()) };
newRow.Append(cell16);
break;
default:
return;
}
}
sheetData.Append(newRow);
}

// Close the document.
workbook.Close();

// 合並單元格,下面會寫出來
int index = 13;
for (int i = 1; i < index; i++)
{
string cellName01 = "A" + i;
string cellName02 = "D" + i;
MergeTwoCells(excelFilePath, sheetName, cellName01, cellName02);
}

}

//創建列標題的寬度
private static Columns CrateColunms(DataTable table)
{
int numCols = table.Columns.Count;
double[] widths = { 8.38, 26.50, 30.63, 11.80 };
Columns columns = new Columns();
Column column = null;
for (UInt32Value index = 1; index <= numCols; index++)
{
column = new Column() { Min = index, Max = index, Width = widths[index - 1], CustomWidth = true };
columns.Append(column);
}
return columns;
}

}

}

使用OpenXml操作Excel,實現導入DataTabel數據<一>