Openxml 笔记
用openxml 生成Excel:
private void GenerateExcelUsingOpenxml(DataTable dataTable, string GeneratePath)
{
using (var workbook = SpreadsheetDocument.Create(GeneratePath, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook))
{
var workbookPart = workbook.AddWorkbookPart();
workbook.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook();
workbook.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets();
InitializeStyleSheet(workbookPart);
uint sheetId = 1;
var excelColumns = new DocumentFormat.OpenXml.Spreadsheet.Columns();
excelColumns.Append(CreateColumnData(1, Convert.ToUInt16(dataTable.Columns.Count + 1), 20));
var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>();
var sheetData = new DocumentFormat.OpenXml.Spreadsheet.SheetData();
sheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet(excelColumns, sheetData);
DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>();
string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart);
if (sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Count() > 0)
{
sheetId = sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Select(s => s.SheetId.Value).Max() + 1;
}
DocumentFormat.OpenXml.Spreadsheet.Sheet sheet = new DocumentFormat.OpenXml.Spreadsheet.Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetId.ToString() };
sheets.Append(sheet);
DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row();
List<String> columns = new List<string>();
foreach (DataColumn column in dataTable.Columns)
{
columns.Add(column.ColumnName);
DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
cell.StyleIndex = 0U;
cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(column.ColumnName);
headerRow.AppendChild(cell);
}
sheetData.AppendChild(headerRow);
foreach (DataRow dsrow in dataTable.Rows)
{
DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row();
foreach (String col in columns)
{
DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString()); //
cell.StyleIndex = 0U;
newRow.AppendChild(cell);
}
sheetData.AppendChild(newRow);
}
workbook.Close();
}
}
用Openxml 做mailmerge:
生成组合模板:public DataTable GenerateGroupTeamplates(DataTable DT)
{
//Add a dictinary type collection
Dictionary<string, int> TemplatePageCollection = new Dictionary<string, int> { };
IEnumerable<string> TemplateGroups = ConnectTemplateAndGroup_new(DT);
DataTable CustomerAndTempInfoDT = AddColumnForCustomerAndTempInfo(DT);
string MergedGroupTemplatesPath = SMConfig.MergedGroupTemplatePath;
string TemplateCopiedFolder =SMConfig.TempleFolderPath;
string SystemTemplatePath = SMConfig.TemplatePath;
DataTable TemplateCollection = GetTemplateInformation();
foreach (string TeamplateString in TemplateGroups)
{
int PageCount = 0;
string[] temps = TeamplateString.Split(',');
for (int i = 0; i < temps.Length; i++)
{
string OneTeampName = SystemTemplatePath + "\\" + TemplateCollection.Select("TemplateIndex='" + temps[i] + "'")[0]["TemplateName"].ToString();//Rows[indexRow]["TemplateName"].ToString();
File.Copy(OneTeampName, TemplateCopiedFolder + "\\" + temps[i]+ ".docx", true);
}
string ConnectFile = TemplateCopiedFolder + "\\" + temps[0] + ".docx";
for (int i = 1; i < temps.Length; i++)
{
string RecursiveFile = TemplateCopiedFolder + "\\" + temps[i] + ".docx";
using (WordprocessingDocument myDoc = WordprocessingDocument.Open(ConnectFile, true))
{
try
{
MainDocumentPart mainPart = myDoc.MainDocumentPart;
Paragraph SectionPageBreakParagraph = new Paragraph(new ParagraphProperties(new SectionProperties(new SectionType() { Val = SectionMarkValues.NextPage })));
Paragraph PageBreakParagraph = new Paragraph(new DocumentFormat.OpenXml.Wordprocessing.Run(new DocumentFormat.OpenXml.Wordprocessing.Break() { Type = BreakValues.Page }));
mainPart.Document.Body.Append(PageBreakParagraph);//此处添加空白页
mainPart.Document.Body.Append(SectionPageBreakParagraph);//add section breakparagraph
string altChunkId = "AltChunkId0" + i;
AlternativeFormatImportPart chunk = mainPart.AddAlternativeFormatImportPart(
AlternativeFormatImportPartType.WordprocessingML, altChunkId);
using (FileStream fileStream = File.Open(RecursiveFile, FileMode.Open))
{
chunk.FeedData(fileStream);
fileStream.Close();
}
AltChunk altChunk = new AltChunk();
altChunk.Id = altChunkId;
using (WordprocessingDocument tempFileDoc = WordprocessingDocument.Open(RecursiveFile, true))
{
PageCount = CountPage(PageCount, tempFileDoc);
IEnumerable<SectionProperties> sectionProperties = tempFileDoc.MainDocumentPart.Document.Body.Elements<SectionProperties>();
mainPart.Document.Body.InsertAfter(altChunk, mainPart.Document.Body.Elements<Paragraph>().Last());
mainPart.Document.Body.Last().Append(sectionProperties.FirstOrDefault().CloneNode(true));
mainPart.Document.Save();
myDoc.Close();
tempFileDoc.Close();
}
}
catch (Exception ex) { }
}
}
string GroupFilePath = MergedGroupTemplatesPath + "\\" + TeamplateString + ".docx";
File.Copy(ConnectFile, GroupFilePath, true);
string[] CopiedFiles = Directory.GetFiles(TemplateCopiedFolder);
for (int deleInd = 0; deleInd < CopiedFiles.Length; deleInd++)
{
File.Delete(CopiedFiles[deleInd]);
}
TemplatePageCollection.Add(new FileInfo(GroupFilePath).Name, PageCount+2);
}
//装载Page到DataTable
foreach (DataRow row in CustomerAndTempInfoDT.Rows)
{
row["Pages"] = TemplatePageCollection[row["GroupTemplateName"].ToString()];
}
return CustomerAndTempInfoDT;
}
Do Merge:
private void DoMerge(GeneratePara Param, string Path, string[] files)
{
for (int i = 0; i < files.Length; i++)
{
string uniqueFileName = string.Format("{0}Part{1}.docx", Path, i);
File.Copy(files[i], uniqueFileName, true);
DataRow[] drs = Param.SourceExcel.Select(String.Format("GroupTemplateName = '{0}'", new FileInfo(files[i]).Name));
CalculateSubPartPages.Add(string.Format("Part{0}.docx", i),Convert.ToInt32(drs[0]["Pages"])*(drs.Count()));
using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(uniqueFileName, true), doc = WordprocessingDocument.Open(files[i], true))
{
XElement body = XElement.Parse(wordDocument.MainDocumentPart.Document.Body.OuterXml);
wordDocument.MainDocumentPart.Document.RemoveAllChildren();
wordDocument.MainDocumentPart.Document.AppendChild<Body>(new Body());
foreach (DataRow row in drs)
{
try
{
BindCalculateCustomerPart(i, row);
DataRow Row = Param.SourceData.Select("customer_no='" + row.ItemArray[0].ToString().PadLeft(9, '0') + "'")[0];
XElement newBody = XElement.Parse(doc.MainDocumentPart.Document.Body.OuterXml);
IList<XElement> mailMergeFields =
(from el in newBody.Descendants()
where ((el.Name == (XMLNS + "t") && el.Value != null && el.Value.Contains("«") && el.Value.Contains("»")))
select el).ToList();
string fieldName = string.Empty;
XElement newElement = null;
foreach (XElement field in mailMergeFields)
{
fieldName = field.Value.Replace("«", "").Replace("»", "").Replace("-", "_");
if (Row.Table.Columns.Contains(fieldName))
{
if (Row[fieldName] == DBNull.Value)
Row[fieldName] = string.Empty;
newElement = field;
newElement.Value = Regex.Replace(Row.Field<string>(fieldName).Trim(), "\\s+", " ", RegexOptions.IgnoreCase);
field.ReplaceWith(newElement);
}
}
Body bo = new Body(newBody.ToString());
wordDocument.MainDocumentPart.Document.Body.AppendChild<Body>(bo);
IEnumerable<SectionProperties> sectionProperties = doc.MainDocumentPart.Document.Body.Elements<SectionProperties>();
wordDocument.MainDocumentPart.Document.Body.Last().Append(sectionProperties.FirstOrDefault().CloneNode(true));
Paragraph PageBreakParagraph = new Paragraph(new ParagraphProperties(new SectionProperties(new SectionType() { Val = SectionMarkValues.EvenPage })));
wordDocument.MainDocumentPart.Document.Body.Append(PageBreakParagraph);//此处添加空白页
}
catch (Exception ex)
{
BindErrorCustomerNoDT(row.ItemArray[0].ToString());
continue;
}
}
wordDocument.MainDocumentPart.Document.Save();
wordDocument.Close();
}
}
}
Openxml 笔记的更多相关文章
- OpenXml SDK学习笔记(1):Word的基本结构
能写多少篇我就不确定了,可能就这一篇就太监了,也有可能会写不少. OpenXml SDK 相信很多人都不陌生,这个就是管Office一家的文档格式,Word, Excel, PowerPoint等都用 ...
- OpenXml SDK学习笔记(4):设置文件级别的样式
观察上一段日记最后的代码: 这里的样式基本可以理解为行内CSS.那么既然有行内的样式,就肯定有外部的样式.那这部分就对应笔记1里说的style.xml文件.这个文件对应的是Document.MainD ...
- VSTO 学习笔记(十)Office 2010 Ribbon开发
原文:VSTO 学习笔记(十)Office 2010 Ribbon开发 微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个R ...
- VSTO学习笔记(九)浅谈Excel内容比较
原文:VSTO学习笔记(九)浅谈Excel内容比较 说起文件内容比较,或许我们首先想到的是UltraCompare这类专业比较的软件,其功能非常强大,能够对基于文本的文件内容作出快速.准确的比较,有详 ...
- VSTO学习笔记(七)基于WPF的Excel分析、转换小程序
原文:VSTO学习笔记(七)基于WPF的Excel分析.转换小程序 近期因为工作的需要,要批量处理Excel文件,于是写了一个小程序,来提升工作效率. 小程序的功能是对Excel进行一些分析.验证,然 ...
- VSTO学习笔记(二)Excel对象模型
原文:VSTO学习笔记(二)Excel对象模型 上一次主要学习了VSTO的发展历史及其历代版本的新特性,概述了VSTO对开发人员的帮助和效率提升.从这次开始,将从VSTO 4.0开始,逐一探讨VSTO ...
- VSTO学习笔记(一)VSTO概述
原文:VSTO学习笔记(一)VSTO概述 接触VSTO纯属偶然,前段时间因为忙于一个项目,在客户端Excel中制作一个插件,从远程服务器端(SharePoint Excel Services)上下载E ...
- delphi操作xml学习笔记 之一 入门必读
Delphi 对XML的支持---TXMLDocument类 Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocum ...
- 【VS开发】VSTO 学习笔记(十)Office 2010 Ribbon开发
微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个Ribbon中,便于集中管理.操作.这种Ribbon是高度可定制的,用户可 ...
随机推荐
- ubuntu 安装 vmware 12
安装VMware Workstation 12 ubuntu15.10安装VMware Workstation12的步骤如下: 1.在 https://download3.vmware.com/sof ...
- git 修改最后一次提交的用户名 或者 commit的内容
修改git最后一次提交的命令 $ git commit --amend 修改git最后一次提交用户名的相关命令 git config user.name 'wangz' git config user ...
- [LeetCode] Flatten 2D Vector 压平二维向量
Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...
- 结构体内嵌函数指针实现C语言面向对象
结构体内嵌函数指针 #include<stdio.h> void say(int age) { printf("我%d岁了\n",age); } struct stud ...
- JQuery选择器
动态修改样式 $("#div1").attr("display","block"); //有问题 $("#div1"). ...
- Servlet中以HashMap存放临时变量,解决跳转新页面请求参数过多时浏览器地址栏超长
具体使用方法如下: 1.在跳转之前将需要的参数串encodeURIComponent后作为参数value,UUID作为key一起POST到Servlet保存到HashMap中: 2.在Servlet发 ...
- 封装js的部分兼容性
//获取标签的内容(兼容所有浏览器)function getInnerText(element) { //能力检测(先判断如果这个能力有这个) if(typeof element.innerText ...
- Java多线程与并发库高级应用-面试题
第一题:现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志,请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,程序只需要运行4秒即可打印完这些日 ...
- Ubuntu下deb文件及tgz文件安装
dpkg 是Debian Package的简写,是为Debian 专门开发的套件管理系统,方便软件的安装.更新及移除.所有源自Debian的Linux发行版都使用dpkg,例如Ubuntu.Knopp ...
- 利用django创建一个投票网站(四)
创建你的第一个 Django 项目, 第四部分 这一篇从第三部分(zh)结尾的地方继续讲起.我们将继续编写投票应用,专注于简单的表单处理并且精简我们的代码. 编写一个简单的表单 让我们更新一下在上一个 ...