利用OpenXML导出数据到excel或读取excel的数据.docx
- 文档编号:25422827
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:20
- 大小:22.22KB
利用OpenXML导出数据到excel或读取excel的数据.docx
《利用OpenXML导出数据到excel或读取excel的数据.docx》由会员分享,可在线阅读,更多相关《利用OpenXML导出数据到excel或读取excel的数据.docx(20页珍藏版)》请在冰豆网上搜索。
利用OpenXML导出数据到excel或读取excel的数据
利用OpenXML导出数据到Exel以及用OpenXML读取excel数据
编辑人:
章波
功能说明:
通过OpenXMLSDK来读写excel,保证excel模板不丢失
编者:
章波
编写时间:
2015-08-3
当前版本:
V1.0
修改时间:
如有需要请把文档补充完整
准备工作
1.首先需要安装OpenXMLSDK2.5forMicrosoftOffice,下载地址
2.在安装了OpenXMLSDK2.5之后,请在VisualStudio中打开现有的项目或应用程序,或者创建新的项目或应用程序。
然后在您的项目或应用程序中,添加对以下组件的引用。
∙DocumentFormat.OpenXml
∙WindowsBase
在MicrosoftVisualStudio2008项目中添加引用
1.在"解决方案资源管理器"中,右键单击"引用",然后单击"添加引用"。
如果"引用"节点不可见,请单击"项目",然后单击"显示所有文件"。
2.在"添加引用"对话框中,单击".NET"。
3.在"组件名称"列中,选择相应的组件(根据需要进行滚动),然后单击"确定"。
向模板excel写入数据
编译本主题中的代码需要以下程序集指令:
usingSystem.Linq;
usingDocumentFormat.OpenXml;
usingDocumentFormat.OpenXml.Packaging;
usingDocumentFormat.OpenXml.Spreadsheet;
获取SpreadsheetDocument对象
在OpenXMLSDK中,SpreadsheetDocument类表示Excel文档包。
若要打开并使用Excel文档,请基于文档创建SpreadsheetDocument类的一个实例。
基于文档创建实例后,即可获取对包含工作表的主工作簿部件的访问权限。
在此包中,使用SpreadsheetML标记将文档中的文本表示为XML形式。
若要从文档中创建类实例,请调用Open重载方法之一。
提供了多个方法,每个方法都有不同的签名。
本主题中的示例代码使用带有需要两个参数的签名的Open(String,Boolean)方法。
第一个参数采用表示要打开的文档的完整路径字符串。
第二个参数是true或false,表示是否要打开文件以进行编辑。
如果此参数为false,则不会保存对该文档所做的任何更改。
下面的using语句中显示了调用Open方法的代码。
C#
//Openthedocumentforediting.
using(SpreadsheetDocumentspreadSheet=SpreadsheetDocument.Open(docName,true))
{
//Insertothercodehere.
}
using语句提供典型.Open,.Save,.Close序列的建议备选序列。
它确保在遇到右大括号时会自动调用Dispose方法(OpenXMLSDK用来清理资源的内部方法)。
using语句后面的块为using语句中创建或指定的对象设定范围,在此示例中这个范围就是spreadSheet。
SpreadsheetML文档的基本结构
SpreadsheetML文档的基本文档结构由引用工作簿中的工作表的Sheets和Sheet元素组成。
将为每个Worksheet创建单独的XML文件。
例如,具有MySheet1和MySheet2这两张工作表的Workbook的SpreadsheetML位于Workbook.xml文件中,并且显示在以下代码示例中。
XML
xmlversion="1.0"encoding="UTF-8"standalone="yes"?
>
//schemas.openxmlformats.org/spreadsheetml/2006/mainxmlns: r="http: //schemas.openxmlformats.org/officeDocument/2006/relationships"> id="rId1"/> id="rId2"/> 工作表XML文件包含一个或多个块级元素(如SheetData)。 sheetData表示单元格表,并且包含一个或多个Row元素。 一个row包含一个或多个Cell元素。 每个单元格包含一个表示相应单元格值的CellValue元素。 例如,工作簿中只在单元格A1中具有值100的第一张工作表的SpreadsheetML位于Sheet1.xml文件中,并且显示在以下代码示例中。 XML xmlversion="1.0"encoding="UTF-8"? > //schemas.openxmlformats.org/spreadsheetml/2006/main"> 示例代码的工作方式 打开SpreadsheetDocument文档进行编辑后,代码将空的Worksheet对象插入到SpreadsheetDocument文档包中。 然后,将新的Cell对象插入到新工作表中并将指定的文本插入到该单元格中。 C# //Givenadocumentnameandtext, // //writesthetexttocell[rowName,colNum]oftheworksheet. publicstaticvoidInsertText(stringdocName,stringsheetName,stringtext,stringrowName,uintcolNum) { //Openthedocumentforediting.从文档中创建类实例,请调用Open重载方法之一。 //第一个参数采用表示要打开的文档的完整路径字符串。 第二个参数是true或false,表示是否要打开文件以进行编辑。 如果此参数为false,则不会保存对该文档所做的任何更改。 using(SpreadsheetDocumentdocument=SpreadsheetDocument.Open(docName,true)) { //GettheSharedStringTablePart.Ifitdoesnotexist,createanewone. SharedStringTablePartshareStringPart; if(document.WorkbookPart.GetPartsOfType { shareStringPart=document.WorkbookPart.GetPartsOfType } else { shareStringPart=document.WorkbookPart.AddNewPart } //InsertthetextintotheSharedStringTablePart. intindex=InsertSharedStringItem(text,shareStringPart); stringstrSheet=sheetName;//strSheet为读写sheet的名字 //sheets接口用来存放需要读写的sheet IEnumerable //获取工作表的worksheetPart WorksheetPartworksheetPart=(WorksheetPart)document.WorkbookPart.GetPartById(sheets.First().Id); //InsertcellA1intothenewworksheet. Cellcell=InsertCellInWorksheet(rowName,colNum,worksheetPart); //SetthevalueofcellA1. cell.CellValue=newCellValue(index.ToString()); cell.DataType=newEnumValue //Savethenewworksheet. worksheetPart.Worksheet.Save(); } } 代码传入一个表示要插入到单元格中的文本的参数和一个表示电子表格的SharedStringTablePart对象的参数。 如果ShareStringTablePart对象不包含SharedStringTable对象,则代码创建一个。 如果文本已存在于ShareStringTable对象中,则代码返回表示文本的SharedStringItem对象的索引。 否则,它创建表示文本的新SharedStringItem对象。 下面的代码验证指定的文本是否存在于SharedStringTablePart对象中,并在不存在时添加文本。 C# //GiventextandaSharedStringTablePart,createsaSharedStringItemwiththespecifiedtext //andinsertsitintotheSharedStringTablePart.Iftheitemalreadyexists,returnsitsindex. privatestaticintInsertSharedStringItem(stringtext,SharedStringTablePartshareStringPart) { //IfthepartdoesnotcontainaSharedStringTable,createone. if(shareStringPart.SharedStringTable==null) { shareStringPart.SharedStringTable=newSharedStringTable(); } inti=0; //IteratethroughalltheitemsintheSharedStringTable.Ifthetextalreadyexists,returnitsindex. foreach(SharedStringItemiteminshareStringPart.SharedStringTable.Elements { if(item.InnerText==text) { returni; } i++; } //Thetextdoesnotexistinthepart.CreatetheSharedStringItemandreturnitsindex. shareStringPart.SharedStringTable.AppendChild(newSharedStringItem(newDocumentFormat.OpenXml.Spreadsheet.Text(text))); shareStringPart.SharedStringTable.Save(); returni; } 代码使用AddNewPart方法向WorkbookPart对象添加新WorksheetPart对象。 然后向WorksheetPart对象添加新Worksheet对象,并通过以下方式获取新工作表的唯一ID: 选择在电子表格文档中使用的最大SheetId对象并加1以创建新工作表ID。 它通过将“Sheet”一词和工作表ID连接在一起来指定工作表的名称。 它然后将新Sheet对象追加到Sheets集合。 下面的代码通过将新的WorksheetPart对象添加到WorkbookPart对象中来插入新的Worksheet对象。 C# //GivenaWorkbookPart,insertsanewworksheet. privatestaticWorksheetPartInsertWorksheet(WorkbookPartworkbookPart) { //Addanewworksheetparttotheworkbook. WorksheetPartnewWorksheetPart=workbookPart.AddNewPart newWorksheetPart.Worksheet=newWorksheet(newSheetData()); newWorksheetPart.Worksheet.Save(); Sheetssheets=workbookPart.Workbook.GetFirstChild stringrelationshipId=workbookPart.GetIdOfPart(newWorksheetPart); //GetauniqueIDforthenewsheet. uintsheetId=1; if(sheets.Elements { sheetId=sheets.Elements } stringsheetName="Sheet"+sheetId; //Appendthenewworksheetandassociateitwiththeworkbook. Sheetsheet=newSheet(){Id=relationshipId,SheetId=sheetId,Name=sheetName}; sheets.Append(sheet); workbookPart.Workbook.Save(); returnnewWorksheetPart; } 为了将单元格插入到工作表中,代码通过按顺序循环访问行元素以查找紧跟在指定行后面的单元格来确定要将新单元格插入到列中的位置。 它将此行保存在refCell变量中。 然后使用InsertBefore方法将新单元格插入到refCell方法引用的单元格之前。 在下面的代码中,将新的Cell对象插入到Worksheet对象中。 C# //Givenacolumnname,arowindex,andaWorksheetPart,insertsacellintotheworksheet. //Ifthecellalreadyexists,returnsit. privatestaticCellInsertCellInWorksheet(stringcolumnName,uintrowIndex,WorksheetPartworksheetPart) { Worksheetworksheet=worksheetPart.Worksheet; SheetDatasheetData=worksheet.GetFirstChild stringcellReference=columnName+rowIndex; //Iftheworksheetdoesnotcontainarowwiththespecifiedrowindex,insertone. Rowrow; if(sheetData.Elements =0) { row=sheetData.Elements } else { row=newRow(){RowIndex=rowIndex}; sheetData.Append(row); } //Ifthereisnotacellwiththespecifiedcolumnname,insertone. if(row.Elements { returnrow.Elements } else { //CellsmustbeinsequentialorderaccordingtoCellReference.Determinewheretoinsertthenewcell. CellrefCell=null; foreach(Cellcellinrow.Elements { if(string.Compare(cell.CellReference.Value,cellReference,true)>0) { refCell=cell; break; } } CellnewCell=newCell(){CellReference=cellReference}; row.InsertBefore(newCell,refCell); worksheet.Save(); returnnewCell; } } 示例代码 以下代码示例用于插入新工作表并将文本写入到名为“Sheet8.xlsx”的特定电子表格文档的新工作表的单元格“A1”中。 若要调用InsertText方法,可以使用以下代码作为示例。 C# InsertText(@"C: \Users\Public\Documents\Sheet8.xlsx","InsertedText"); 以下是使用C#和VisualBasic编写的完整示例代码。 C# //Givenadocumentnameandtext, //insertsanewworksheetandwritesthetexttocell"A1"ofthenewworksheet. publicstaticvoidInsertText(stringdocName,stringtext) { //Openthedocumentforediting. using(SpreadsheetDocumentspreadSheet=SpreadsheetDocument.Open(docName,true)) { //GettheSharedStringTablePart.Ifitdoesnotexist,createanewone. SharedStringTablePartshareStringPart; if(spreadSheet.WorkbookPart.GetPartsOfType { shareStringPart=spreadSheet.WorkbookPart.GetPartsOfType } else { shareStringPart=spreadSheet.WorkbookPart.AddNewPart } //InsertthetextintotheSharedStringTablePart. intindex=InsertSharedStringItem(text,shareStringPart); //Insertanewworksheet. WorksheetPartworksheetPart=InsertWorksheet(spreadSheet.WorkbookPart); //InsertcellA1intothenewworksheet. Cellcell=InsertCellInWorksheet("A",1,worksheetPart); //SetthevalueofcellA1. cell.CellValue=newCellValue(index.ToString()); cell.DataType=newEnumValue //Savethenewworksheet. worksheetPart.Worksheet.Save(); } } //G
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 OpenXML 导出 数据 excel 读取