1.开发用途:用于将页面数据或者后台数据生成word2007格式,并提供下载。
2.开发环境:vs2008 + office2007 + DocumentFormat.OpenXml sdk(我用的版本是:2.0.4330.0,具体组件可在微软官方下载)。
3.主要代码如下:
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
/// <summary>
/// 生成2007文档
/// </summary>
/// <param name="docName"></param>
public void CreateDocumentFile(string docName)
{
// Create a Wordprocessing document.
string temp = Server.MapPath(@"..\Template\个人履历.docx");
if (File.Exists(temp)) File.Delete(temp);
File.Copy(docName, temp);
using (WordprocessingDocument myDoc = WordprocessingDocument.Open(temp, true))
{
DocumentFormat.OpenXml.Wordprocessing.Table table = CreateMainTable(12, 4, true,myDoc);
myDoc.MainDocumentPart.Document.Body.Append(table);
myDoc.MainDocumentPart.Document.Save();
}
ResponseFile(temp);
}
/// <summary>
/// 生成页面主表格
/// </summary>
/// <param name="rowCount"></param>
/// <param name="ColumnCount"></param>
/// <param name="HaveBorder"></param>
/// <param name="wd"></param>
/// <returns></returns>
protected DocumentFormat.OpenXml.Wordprocessing.Table CreateMainTable(int rowCount, int ColumnCount, bool HaveBorder,WordprocessingDocument wd)
{
//创建新表格
DocumentFormat.OpenXml.Wordprocessing.Table table = new DocumentFormat.OpenXml.Wordprocessing.Table();
//设置表格边线
DocumentFormat.OpenXml.Wordprocessing.TableProperties tblPr = TpHaveBorder(true);
table.Append(tblPr);
DocumentFormat.OpenXml.Wordprocessing.TableRow tr =new DocumentFormat.OpenXml.Wordprocessing.TableRow();
DocumentFormat.OpenXml.Wordprocessing.TableCell tc=new DocumentFormat.OpenXml.Wordprocessing.TableCell();
//first row - title
//主要资料录入
DocumentFormat.OpenXml.Wordprocessing.Table ta = CreateSubTable(1, 2,wd);
tc.Append(ta);
//
TableCellProperties tcp = new TableCellProperties();
GridSpan gridSpan = new GridSpan();
gridSpan.Val = 11;
tcp.Append(gridSpan);
tc.Append(tcp);
DocumentFormat.OpenXml.Wordprocessing.Text x = new DocumentFormat.OpenXml.Wordprocessing.Text("");
Run run_paragraph = new Run();
run_paragraph.Append(x);
DocumentFormat.OpenXml.Wordprocessing.Paragraph paragraph = new DocumentFormat.OpenXml.Wordprocessing.Paragraph();
paragraph.Append(run_paragraph);
tc.Append(paragraph); tr.Append(tc); table.Append(tr);
IList<LINQDB.HRDB.EmpFile_Education> edu;
IList<LINQDB.HRDB.EmpFile_Family> fam;
IList<LINQDB.HRDB.EmpFile_Working> work;
IList<LINQDB.HRDB.EmpFile_Emergency> emer;
using (var db = new LINQDB.HRDB.HRDBDataContext())
{
fam = db.EmpFile_Family.Where(p => p.EmpID == PageArg.Id1).ToList();
edu = db.EmpFile_Education.Where(p => p.EmpID == PageArg.Id1).ToList();
emer = db.EmpFile_Emergency.Where(p => p.EmpID == PageArg.Id1).ToList();
work = db.EmpFile_Working.Where(p => p.EmpID == PageArg.Id1).ToList();
}
table = CreateFamilyDoc(table, fam); table = CreateEduDoc(table, edu); table = CreateEmerDoc(table,emer);
table = CreateWorkDoc(table, work);
return table;
}
/// <summary>
/// 创建子表格
/// </summary>
/// <param name="rowCount"></param>
/// <param name="ColumnCount"></param>
/// <returns></returns>
protected DocumentFormat.OpenXml.Wordprocessing.Table CreateSubTable(int rowCount, int ColumnCount,WordprocessingDocument wd)
{
string imageId = "rIdImg";string picName = PageArg.Id1+".jpg";string fullPath = RootPath + @"\Employees\"+picName;
if (!File.Exists(fullPath))
{
fullPath = GetDefaultPhotoPath(RootPath);
picName = fullPath.Substring(fullPath.LastIndexOf(@"\")+1);
}
ImagePart imagePart = wd.MainDocumentPart.AddImagePart(ImagePartType.Jpeg, imageId);
using (FileStream stream = new FileStream(fullPath, FileMode.Open))
{
imagePart.FeedData(stream);
}
DocumentFormat.OpenXml.Wordprocessing.Table table = new DocumentFormat.OpenXml.Wordprocessing.Table();
DocumentFormat.OpenXml.Wordprocessing.TableProperties tblPr = TpHaveBorder(false);table.Append(tblPr);
DocumentFormat.OpenXml.Wordprocessing.TableRow tr = new DocumentFormat.OpenXml.Wordprocessing.TableRow();
DocumentFormat.OpenXml.Wordprocessing.TableCell tc = new DocumentFormat.OpenXml.Wordprocessing.TableCell();
DocumentFormat.OpenXml.Wordprocessing.Paragraph paragraph = CreateCellText("个人履历");
tc.Append(paragraph);
tr.Append(tc); table.Append(tr);
int k = -1;
for (int i = 0; i < 5; i++)
{
tr = new DocumentFormat.OpenXml.Wordprocessing.TableRow();
for (int j = 0; j < 4; j++)
{
k++;
tc = new DocumentFormat.OpenXml.Wordprocessing.TableCell();
if (j == 0)
{
if( k > 0)
k--;
TableCellProperties tp;
if (i == 0)
{
tp = new TableCellProperties(
new TableCellWidth() { Width = 2093, Type = TableWidthUnitValues.Dxa },
new VerticalMerge() { Val = MergedCellValues.Restart });
}
else
{
tp = new TableCellProperties(
new TableCellWidth() { Width = 2093, Type = TableWidthUnitValues.Dxa },
new VerticalMerge() { Val = MergedCellValues.Continue });
}
if (i == 0)
{
Run rDrawing = new Run();
string img = CreateImageXml(imageId, picName, 1133334, 1371429);
Drawing d = new Drawing(img);
rDrawing.AppendChild(d);
DocumentFormat.OpenXml.Wordprocessing.Paragraph pDrawing = new DocumentFormat.OpenXml.Wordprocessing.Paragraph();
pDrawing.AppendChild(rDrawing);
tc.AppendChild(pDrawing);
}
tc.Append(tp);
}
if (i == 0 && j == 0) { }
else
tc.Append(CreateCellText(showName[k]));
tr.Append(tc);
}
table.Append(tr);
}
for (int i = 0; i < 2; i++)
{
tr = new DocumentFormat.OpenXml.Wordprocessing.TableRow();
k++;
tc = new DocumentFormat.OpenXml.Wordprocessing.TableCell();
TableCellProperties tp = new TableCellProperties(
new TableCellWidth() { Type = TableWidthUnitValues.Dxa },
new GridSpan() { Val = 4 });
tc.Append(tp);
tc.Append(CreateCellText(showName[k]));
tr.Append(tc);
table.Append(tr);
}
for (int i = 0; i < 3; i++)
{
tr = new DocumentFormat.OpenXml.Wordprocessing.TableRow();
for (int j = 0; j < 4; j++)
{
k++;
tc = new DocumentFormat.OpenXml.Wordprocessing.TableCell();
tc.Append(CreateCellText(showName[k]));
tr.Append(tc);
}
table.Append(tr);
}
return table;
}
/// <summary>
/// 生成TableCell中图片
/// </summary>
/// <param name="relId">imagePart's Id</param>
/// <param name="imageName">图片名称,不带路径</param>
/// <param name="width">图片宽度</param>
/// <param name="height">图片高度</param>
/// <returns></returns>
protected string CreateImageXml(string relId, string imageName, int width, int height)
{
//Looking to add an image to WordprocessingML? Creating the xml is the easiest way.
string img = @"
<w:drawing xmlns:w=""http://schemas.openxmlformats.org/wordprocessingml/2006/main"">
<wp:inline xmlns:wp=""http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"">
<wp:extent cx=""" + width + @""" cy=""" + height + @""" />
<wp:docPr name=""" + imageName + @""" id=""1"" />
<a:graphic xmlns:a=""http://schemas.openxmlformats.org/drawingml/2006/main"">
<a:graphicData uri=""http://schemas.openxmlformats.org/drawingml/2006/picture"">
<pic:pic xmlns:pic=""http://schemas.openxmlformats.org/drawingml/2006/picture"">
<pic:nvPicPr>
<pic:cNvPr id=""0"" name=""" + imageName + @""" />
<pic:cNvPicPr />
</pic:nvPicPr>
<pic:blipFill>
<a:blip r:embed=""" + relId + @""" xmlns:r=""http://schemas.openxmlformats.org/officeDocument/2006/relationships"" />
<a:stretch>
<a:fillRect />
</a:stretch>
</pic:blipFill>
<pic:spPr>
<a:xfrm>
<a:off x=""0"" y=""0"" />
<a:ext cx=""" + width + @""" cy=""" + height + @""" />
</a:xfrm>
<a:prstGeom prst=""rect"" />
</pic:spPr>
</pic:pic>
</a:graphicData>
</a:graphic>
</wp:inline>
</w:drawing>";
return img;
}
/// <summary>
/// 创建文本
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
protected DocumentFormat.OpenXml.Wordprocessing.Paragraph CreateCellText(string context)
{
DocumentFormat.OpenXml.Wordprocessing.Text x = new DocumentFormat.OpenXml.Wordprocessing.Text(context);
Run run_paragraph = new Run(); run_paragraph.Append(x);
DocumentFormat.OpenXml.Wordprocessing.Paragraph paragraph = new DocumentFormat.OpenXml.Wordprocessing.Paragraph(); paragraph.Append(run_paragraph);
return paragraph;
}
/// <summary>
/// 表格属性
/// </summary>
/// <param name="isHave">是否具有框线</param>
/// <returns></returns>
protected TableProperties TpHaveBorder(bool haveBorder)
{
BorderValues bv = haveBorder == true ? BorderValues.Single : BorderValues.None;
DocumentFormat.OpenXml.Wordprocessing.TableProperties tblPr = new DocumentFormat.OpenXml.Wordprocessing.TableProperties(); TableBorders tblBorders = new TableBorders();
tblBorders.TopBorder = new DocumentFormat.OpenXml.Wordprocessing.TopBorder();
tblBorders.TopBorder.Val = new EnumValue<BorderValues>(bv);
tblBorders.BottomBorder = new DocumentFormat.OpenXml.Wordprocessing.BottomBorder();
tblBorders.BottomBorder.Val = new EnumValue<BorderValues>(bv);
tblBorders.LeftBorder = new DocumentFormat.OpenXml.Wordprocessing.LeftBorder();
tblBorders.LeftBorder.Val = new EnumValue<BorderValues>(bv);
tblBorders.RightBorder = new DocumentFormat.OpenXml.Wordprocessing.RightBorder();
tblBorders.RightBorder.Val = new EnumValue<BorderValues>(bv);
tblBorders.InsideHorizontalBorder = new DocumentFormat.OpenXml.Wordprocessing.InsideHorizontalBorder();
tblBorders.InsideHorizontalBorder.Val = bv;
tblBorders.InsideVerticalBorder = new DocumentFormat.OpenXml.Wordprocessing.InsideVerticalBorder();
tblBorders.InsideVerticalBorder.Val = bv;
tblPr.Append(tblBorders);
return tblPr;
}
最终效果:
总结:有关生成word2007的文章不少,可大部分都千篇一律,而且也没有什么实际意义.于是把眼光放到MSDN,终于,在总结两位外国编程高手的代码,并加以修改和融合后,形成了最终如上图所示的效果.基本算是合格了.当然代码写得不太好.有些乱.待有时间逐步完善和改进一下.希望此篇"杂文"中的一些代码段能对同行们有所帮助,也希望读者能有更简洁的生成word2007的方案,此文权当是抛砖引玉吧.