利用OpenXML向Excel单元格插入内容Word文档格式.docx
《利用OpenXML向Excel单元格插入内容Word文档格式.docx》由会员分享,可在线阅读,更多相关《利用OpenXML向Excel单元格插入内容Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
}
using语句提供典型.Open,.Save,.Close序列的建议备选序列。
它确保在遇到右大括号时会自动调用Dispose方法(OpenXMLSDK用来清理资源的内部方法)。
using语句后面的块为using语句中创建或指定的对象设定范围,在此示例中这个范围就是spreadSheet。
SpreadsheetML文档的基本结构
SpreadsheetML文档的基本文档结构由引用工作簿中的工作表的Sheets和Sheet元素组成。
将为每个Worksheet创建单独的XML文件。
例如,具有MySheet1和MySheet2这两张工作表的Workbook的SpreadsheetML位于文件中,并且显示在以下代码示例中。
XML
<
xmlversion="
"
encoding="
UTF-8"
standalone="
yes"
>
workbookxmlns=xmlns:
r="
>
<
sheets>
sheetname="
MySheet1"
sheetId="
1"
r:
id="
rId1"
/>
MySheet2"
2"
rId2"
/sheets>
/workbook>
工作表XML文件包含一个或多个块级元素(如SheetData)。
sheetData表示单元格表,并且包含一个或多个Row元素。
一个row包含一个或多个Cell元素。
每个单元格包含一个表示相应单元格值的CellValue元素。
例如,工作簿中只在单元格A1中具有值100的第一张工作表的SpreadsheetML位于文件中,并且显示在以下代码示例中。
worksheetxmlns="
sheetData>
rowr="
cr="
A1"
v>
100<
/v>
/c>
/row>
/sheetData>
/worksheet>
示例代码的工作方式
打开SpreadsheetDocument文档进行编辑后,代码将空的Worksheet对象插入到SpreadsheetDocument文档包中。
然后,将新的Cell对象插入到新工作表中并将指定的文本插入到该单元格中。
publicstaticvoidInsertText(stringdocName,stringtext)
Imports(SpreadsheetDocumentspreadSheet=(docName,true))
{
Ifitdoesnotexist,createanewone.
SharedStringTablePartshareStringPart;
if>
0)
shareStringPart=}
else
intindex=InsertSharedStringItem(text,shareStringPart);
WorksheetPartworksheetPart=InsertWorksheet;
Cellcell=InsertCellInWorksheet("
A"
1,worksheetPart);
=newCellValue());
=newEnumValue<
CellValues>
;
}
代码传入一个表示要插入到单元格中的文本的参数和一个表示电子表格的SharedStringTablePart对象的参数。
如果ShareStringTablePart对象不包含SharedStringTable对象,则代码创建一个。
如果文本已存在于ShareStringTable对象中,则代码返回表示文本的SharedStringItem对象的索引。
否则,它创建表示文本的新SharedStringItem对象。
下面的代码验证指定的文本是否存在于SharedStringTablePart对象中,并在不存在时添加文本。
Iftheitemalreadyexists,returnsitsindex.
privatestaticintInsertSharedStringItem(stringtext,SharedStringTablePartshareStringPart)
if==null)
=newSharedStringTable();
inti=0;
Ifthetextalreadyexists,returnitsindex.
foreach(SharedStringItemitemin{
if==text)
returni;
i++;
CreatetheSharedStringItemandreturnitsindex.
SharedStringItem(newreturni;
代码使用AddNewPart方法向WorkbookPart对象添加新WorksheetPart对象。
然后向WorksheetPart对象添加新Worksheet对象,并通过以下方式获取新工作表的唯一ID:
选择在电子表格文档中使用的最大SheetId对象并加1以创建新工作表ID。
它通过将“Sheet”一词和工作表ID连接在一起来指定工作表的名称。
它然后将新Sheet对象追加到Sheets集合。
下面的代码通过将新的WorksheetPart对象添加到WorkbookPart对象中来插入新的Worksheet对象。
privatestaticWorksheetPartInsertWorksheet(WorkbookPartworkbookPart)
WorksheetPartnewWorksheetPart=<
WorksheetPart>
();
=newWorksheet(newSheetData());
Sheetssheets=stringrelationshipId=(newWorksheetPart);
uintsheetId=1;
if<
Sheet>
().Count()>
sheetId=<
().Select(s=>
+1;
stringsheetName="
Sheet"
+sheetId;
Sheetsheet=newSheet(){Id=relationshipId,SheetId=sheetId,Name=sheetName};
(sheet);
returnnewWorksheetPart;
为了将单元格插入到工作表中,代码通过按顺序循环访问行元素以查找紧跟在指定行后面的单元格来确定要将新单元格插入到列中的位置。
它将此行保存在refCell变量中。
然后使用InsertBefore方法将新单元格插入到refCell方法引用的单元格之前。
在下面的代码中,将新的Cell对象插入到Worksheet对象中。
C#
privatestaticCellInsertCellInWorksheet(stringcolumnName,uintrowIndex,WorksheetPartworksheetPart)
Worksheetworksheet=;
SheetDatasheetData=<
SheetData>
stringcellReference=columnName+rowIndex;
Rowrow;
Row>
().Where(r=>
==rowIndex).Count()!
=0)
row=<
==rowIndex).First();
row=newRow(){RowIndex=rowIndex};
(row);
Cell>
().Where(c=>
==columnName+rowIndex).Count()>
return<
==cellReference).First();
Determinewheretoinsertthenewcell.
CellrefCell=null;
foreach(Cellcellin<
())
ifcellReference,true)>
refCell=cell;
break;
CellnewCell=newCell(){CellReference=cellReference};
(newCell,refCell);
();
returnnewCell;
示例代码
以下代码示例用于插入新工作表并将文本写入到名为“”的特定电子表格文档的新工作表的单元格“A1”中。
若要调用InsertText方法,可以使用以下代码作为示例。
InsertText(@"
C:
\Users\Public\Documents\"
"
InsertedText"
);
以下是使用C#和VisualBasic编写的完整示例代码。
publicstaticvoidInsertText(stringdocName,stringtext)
using(SpreadsheetDocumentspreadSheet=(docName,true))
Iftheitemalreadyexists,returnsitsindex.
privatestaticintInsertSharedStringItem(stringtext,SharedStringTablePartshareStringPart)
SharedStringItem(newreturni;
privatestaticWorksheetPartInsertWorksheet(WorkbookPartworkbookPart)
WorksheetPartnewWorksheetPart=<
Sheetsheet=newSheet(){Id=relationshipId,SheetId=sheetId,Name=sheetName};
privatestaticCellInsertCellInWorksheet(stringcolumnName,uintrowIndex,WorksheetPartworksheetPart)
row=<