DBCHM/DocTools/DBDoc/WordDoc.cs

512 lines
23 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections.Generic;
using Aspose.Words.Tables;
using DocTools.Dtos;
namespace DocTools.DBDoc
{
public class WordDoc : Doc
{
public WordDoc(DBDto dto, string filter = "word files (.doc)|*.doc") : base(dto, filter)
{
}
public override void Build(string filePath)
{
WordUtils.ExportWordByAsposeWords(filePath, this.Dto);
}
}
/// <summary>
/// Word处理工具类
/// </summary>
internal static class WordUtils
{
private static string asposeBookmark_prefix = "AsposeBookmark";
private static string asposeBookmarkLog = "asposeBookmarkLog";
private static string asposeBookmarkOverview = "asposeBookmarkOverview";
/// <summary>
/// 引用Aspose.Words.dll导出word数据库字典文档
/// 注意不依赖微软office办公软件
/// </summary>
/// <param name="databaseName"></param>
/// <param name="tables"></param>
public static void ExportWordByAsposeWords(string fileName, DBDto dto)
{
var databaseName = dto.DBName;
var tables = dto.Tables;
Aspose.Words.Document doc = new Aspose.Words.Document();
// TODO document properties
doc.BuiltInDocumentProperties.Subject = "设计文档";
doc.BuiltInDocumentProperties.ContentType = "数据库字典";
doc.BuiltInDocumentProperties.Title = "数据库字典文档";
doc.BuiltInDocumentProperties.Author = doc.BuiltInDocumentProperties.LastSavedBy = doc.BuiltInDocumentProperties.Manager = "trycache";
doc.BuiltInDocumentProperties.Company = "51Try.Top";
doc.BuiltInDocumentProperties.Version = doc.BuiltInDocumentProperties.RevisionNumber = 1;
doc.BuiltInDocumentProperties.ContentStatus = "初稿";
doc.BuiltInDocumentProperties.NameOfApplication = "DBCHM";
doc.BuiltInDocumentProperties.LastSavedTime = doc.BuiltInDocumentProperties.CreatedTime = System.DateTime.Now;
// TODO header and footer setting
Aspose.Words.HeaderFooter header = new Aspose.Words.HeaderFooter(doc, Aspose.Words.HeaderFooterType.HeaderPrimary);
doc.FirstSection.HeadersFooters.Add(header);
// Add a paragraph with text to the header.
header.AppendParagraph("数智化合规系统字典").ParagraphFormat.Alignment =
Aspose.Words.ParagraphAlignment.Right;
Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(doc);
// TODO 创建文档标题书签
CreateBookmark(builder, Aspose.Words.ParagraphAlignment.Center, Aspose.Words.OutlineLevel.Level1, 25,
asposeBookmark_prefix + "0", "数据库字典文档");
builder.ParagraphFormat.OutlineLevel = Aspose.Words.OutlineLevel.BodyText;
builder.Writeln("—— " + databaseName);
// TODO 换行
builder.InsertBreak(Aspose.Words.BreakType.ParagraphBreak);
builder.InsertBreak(Aspose.Words.BreakType.ParagraphBreak);
builder.InsertBreak(Aspose.Words.BreakType.ParagraphBreak);
// TODO 数据库字典文档修订日志表
CreateBookmark(builder, Aspose.Words.ParagraphAlignment.Center, Aspose.Words.OutlineLevel.Level2, 16,
asposeBookmarkLog, AppConst.LOG_CHAPTER_NAME);
CreateLogTable(builder);
builder.InsertBreak(Aspose.Words.BreakType.PageBreak);
// TODO 创建数据库字典文档数据库概况一览表
CreateBookmark(builder, Aspose.Words.ParagraphAlignment.Center, Aspose.Words.OutlineLevel.Level2, 16,
asposeBookmarkOverview, AppConst.TABLE_CHAPTER_NAME);
CreateOverviewTable(builder, tables);
builder.InsertBreak(Aspose.Words.BreakType.PageBreak);
// TODO 创建书签
CreateBookmark(builder, Aspose.Words.ParagraphAlignment.Left, Aspose.Words.OutlineLevel.Level2, 16,
asposeBookmark_prefix + 1, AppConst.TABLE_STRUCTURE_CHAPTER_NAME);
int i = 1; // 计数器
// TODO 遍历数据库表集合
foreach (var table in tables)
{
string bookmarkName = table.TableName + " " + (!string.IsNullOrWhiteSpace(table.Comment) ? table.Comment : "");
// TODO 创建书签
CreateBookmark(builder, Aspose.Words.ParagraphAlignment.Left, Aspose.Words.OutlineLevel.Level3, 16,
asposeBookmark_prefix + i, table.TableOrder + "、" + bookmarkName);
// TODO 遍历数据库表字段集合
// TODO 创建表格
Aspose.Words.Tables.Table asposeTable = builder.StartTable();
// 清除段落样式
builder.ParagraphFormat.ClearFormatting();
#region
// Make the header row.
builder.InsertCell();
// Set the left indent for the table. Table wide formatting must be applied after
// at least one row is present in the table.
asposeTable.Alignment = Aspose.Words.Tables.TableAlignment.Center;
asposeTable.PreferredWidth = PreferredWidth.FromPercent(100);
asposeTable.AllowAutoFit = false;
// Set height and define the height rule for the header row.
builder.RowFormat.Height = 25.0;
builder.RowFormat.HeightRule = Aspose.Words.HeightRule.AtLeast;
// Some special features for the header row.
builder.CellFormat.Shading.BackgroundPatternColor = System.Drawing.Color.FromArgb(198, 217, 241);
builder.ParagraphFormat.Alignment = Aspose.Words.ParagraphAlignment.Center;
builder.Font.Size = 10;
builder.Font.Name = "宋体";
builder.Font.Bold = true;
builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(8);
builder.Write("序号");
// We don't need to specify the width of this cell because it's inherited from the previous cell.
builder.InsertCell();
builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(15);
builder.Write("字段名称");
builder.InsertCell();
builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(25);
builder.Write("字段描述");
builder.InsertCell();
builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(12);
builder.Write("数据类型");
builder.InsertCell();
builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(10);
builder.Write("长度");
//builder.InsertCell();
//builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(8);
//builder.Write("小数位");
builder.InsertCell();
builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(10);
builder.Write("主键");
//if (!table.DBType.StartsWith("Oracle"))
//{
// builder.InsertCell();
// builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(7);
// builder.Write("自增");
//}
builder.InsertCell();
builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(10);
builder.Write("允许空");
builder.InsertCell();
builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(8);
builder.Write("默认值");
builder.EndRow();
#endregion
foreach (var column in table.Columns)
{
#region
// Set features for the other rows and cells.
builder.CellFormat.Shading.BackgroundPatternColor = System.Drawing.Color.White;
builder.CellFormat.Width = 100.0;
builder.CellFormat.VerticalAlignment = Aspose.Words.Tables.CellVerticalAlignment.Center;
//builder.CellFormat.FitText = true;
// Reset height and define a different height rule for table body
builder.RowFormat.Height = 20.0;
builder.RowFormat.HeightRule = Aspose.Words.HeightRule.AtLeast;
builder.InsertCell();
// Reset font formatting.
builder.Font.Size = 9;
builder.Font.Bold = false;
builder.Write(column.ColumnOrder); // 序号
builder.InsertCell();
builder.Write(column.ColumnName); // 列名
builder.InsertCell();
builder.Font.Size = 9;
builder.Write(column.Comment); // 列说明
builder.InsertCell();
builder.Write(column.ColumnTypeName); // 数据类型
builder.InsertCell();
builder.Write(column.Length); // 长度
//builder.InsertCell();
//builder.Write(column.Scale); // 小数位
builder.InsertCell();
builder.Write(column.IsPK); // 主键
//if (!table.DBType.StartsWith("Oracle"))
//{
// builder.InsertCell();
// builder.Write(column.IsIdentity); // 自增
//}
builder.InsertCell();
builder.Write(column.CanNull); // 是否为空
builder.InsertCell();
builder.Font.Size = 9;
builder.Write(column.DefaultVal); // 默认值
builder.EndRow();
#endregion
}
// TODO 表格创建完成,结束
//asposeTable.PreferredWidth = Aspose.Words.Tables.PreferredWidth.Auto;
//asposeTable.AutoFit(Aspose.Words.Tables.AutoFitBehavior.AutoFitToContents);
builder.EndTable();
i++;
// TODO page breaks
if (i < tables.Count)
{
builder.InsertBreak(Aspose.Words.BreakType.PageBreak);
}
}
// TODO 生成页码
AutoGenPageNum(doc, builder);
// TODO 添加水印
//InsertWatermarkText(doc, "DBCHM-51Try.Top");
doc.Save(fileName);
}
/// <summary>
/// 生成页码
/// </summary>
/// <param name="builder"></param>
public static void AutoGenPageNum(Aspose.Words.Document doc, Aspose.Words.DocumentBuilder builder)
{
Aspose.Words.HeaderFooter footer = new Aspose.Words.HeaderFooter(doc, Aspose.Words.HeaderFooterType.FooterPrimary);
doc.FirstSection.HeadersFooters.Add(footer);
// Add a paragraph with text to the footer.
footer.AppendParagraph("").ParagraphFormat.Alignment = Aspose.Words.ParagraphAlignment.Center;
// We want to insert a field like this: {PAGE} / {NUMPAGES}
// TODO Go to the primary footer
builder.MoveToHeaderFooter(Aspose.Words.HeaderFooterType.FooterPrimary);
// TODO Add fields for current page number
builder.InsertField("PAGE");
// TODO Add any custom text formatter
builder.Write(" / ");
// TODO Add field for total page numbers in document
builder.InsertField("NUMPAGES");
// Finally update the outer field to recalcaluate the final value.
// Doing this will automatically update the inner fields at the same time.
// field.Update();
}
/// <summary>
/// 创建数据库字典文档修订日志表
/// </summary>
/// <param name="builder"></param>
private static void CreateLogTable(Aspose.Words.DocumentBuilder builder)
{
// 清除段落样式
builder.ParagraphFormat.ClearFormatting();
// TODO 创建表格
Aspose.Words.Tables.Table logTable = builder.StartTable();
#region
// Make the header row.
builder.InsertCell();
// Set the left indent for the table. Table wide formatting must be applied after
// at least one row is present in the table.
logTable.Alignment = Aspose.Words.Tables.TableAlignment.Center;
logTable.AllowAutoFit = true;
// Set height and define the height rule for the header row.
builder.RowFormat.Height = 40.0;
builder.RowFormat.HeightRule = Aspose.Words.HeightRule.AtLeast;
// Some special features for the header row.
builder.CellFormat.Shading.BackgroundPatternColor = System.Drawing.Color.FromArgb(198, 217, 241);
builder.CellFormat.VerticalAlignment = Aspose.Words.Tables.CellVerticalAlignment.Center;
builder.ParagraphFormat.Alignment = Aspose.Words.ParagraphAlignment.Center;
builder.Font.Size = 14;
builder.Font.Name = "Arial";
builder.Font.Bold = true;
builder.CellFormat.Width = 100.0;
builder.Write("版本号");
// We don't need to specify the width of this cell because it's inherited from the previous cell.
builder.InsertCell();
builder.Write("修订日期");
builder.InsertCell();
builder.Write("修订内容");
builder.InsertCell();
builder.Write("修订人");
builder.InsertCell();
builder.Write("审核人");
builder.EndRow();
#endregion
for (var i = 0; i < 5; i++)
{
#region
// Set features for the other rows and cells.
builder.CellFormat.Shading.BackgroundPatternColor = System.Drawing.Color.White;
builder.CellFormat.Width = 100.0;
builder.CellFormat.VerticalAlignment = Aspose.Words.Tables.CellVerticalAlignment.Center;
// Reset height and define a different height rule for table body
builder.RowFormat.Height = 40.0;
builder.InsertCell();
// Reset font formatting.
builder.Font.Size = 12;
builder.Font.Bold = false;
builder.Write(""); // 版本号
builder.InsertCell();
builder.Write(""); // 修订日期
builder.InsertCell();
builder.Write(""); // 修订内容
builder.InsertCell();
builder.Write(""); // 修订人
builder.InsertCell();
builder.Write(""); // 审核人
builder.EndRow();
#endregion
}
// TODO 表格创建完成,结束
builder.EndTable();
}
/// <summary>
/// 创建数据库字典文档数据库概况一览表
/// </summary>
/// <param name="builder"></param>
/// <param name="tables"></param>
private static void CreateOverviewTable(Aspose.Words.DocumentBuilder builder, List<TableDto> tables)
{
// 清除段落样式
builder.ParagraphFormat.ClearFormatting();
// TODO 创建表格
Aspose.Words.Tables.Table overviewTable = builder.StartTable();
#region
// Make the header row.
builder.InsertCell();
// Set the left indent for the table. Table wide formatting must be applied after
// at least one row is present in the table.
overviewTable.Alignment = Aspose.Words.Tables.TableAlignment.Center;
overviewTable.AllowAutoFit = true;
// Set height and define the height rule for the header row.
builder.RowFormat.Height = 40.0;
builder.RowFormat.HeightRule = Aspose.Words.HeightRule.AtLeast;
// Some special features for the header row.
builder.CellFormat.Shading.BackgroundPatternColor = System.Drawing.Color.FromArgb(198, 217, 241);
builder.CellFormat.VerticalAlignment = Aspose.Words.Tables.CellVerticalAlignment.Center;
builder.ParagraphFormat.Alignment = Aspose.Words.ParagraphAlignment.Center;
builder.Font.Size = 14;
builder.Font.Name = "Arial";
builder.Font.Bold = true;
builder.CellFormat.Width = 100.0;
builder.Write("序号");
builder.InsertCell();
builder.Write("表名");
builder.InsertCell();
builder.Write("注释/说明");
builder.EndRow();
#endregion
// TODO 遍历数据库表集合
foreach (var table in tables)
{
#region
// Set features for the other rows and cells.
builder.CellFormat.Shading.BackgroundPatternColor = System.Drawing.Color.White;
builder.CellFormat.Width = 100.0;
builder.CellFormat.VerticalAlignment = Aspose.Words.Tables.CellVerticalAlignment.Center;
// Reset height and define a different height rule for table body
builder.RowFormat.Height = 40.0;
builder.InsertCell();
// Reset font formatting.
builder.Font.Size = 12;
builder.Font.Bold = false;
builder.Write(table.TableOrder); // 序号
builder.InsertCell();
builder.Write(table.TableName); // 表名
builder.InsertCell();
builder.Write((!string.IsNullOrWhiteSpace(table.Comment) ? table.Comment : "")); // 说明
#endregion
builder.EndRow();
}
// TODO 表格创建完成,结束
builder.EndTable();
}
/// <summary>
/// 创建书签
/// </summary>
/// <param name="builder"></param>
/// <param name="alignment"></param>
/// <param name="outlineLevel"></param>
/// <param name="fontSize"></param>
/// <param name="bookmarkName"></param>
/// <param name="bookmarkText"></param>
private static void CreateBookmark(Aspose.Words.DocumentBuilder builder, Aspose.Words.ParagraphAlignment alignment,
Aspose.Words.OutlineLevel outlineLevel, double fontSize, string bookmarkName, string bookmarkText)
{
// 清除段落样式
builder.ParagraphFormat.ClearFormatting();
// TODO 创建书签
builder.StartBookmark(bookmarkName);
builder.ParagraphFormat.Alignment = alignment;
builder.ParagraphFormat.OutlineLevel = outlineLevel;
builder.ParagraphFormat.SpaceBefore = builder.ParagraphFormat.SpaceAfter = 15;
builder.Font.Size = fontSize;
builder.Font.Name = "Arial";
builder.Font.Bold = true;
builder.Writeln(bookmarkText);
builder.EndBookmark(bookmarkName);
}
/// <summary>
/// Inserts a watermark into a document.
/// </summary>
/// <param name="doc">The input document.</param>
/// <param name="watermarkText">Text of the watermark.</param>
public static void InsertWatermarkText(Aspose.Words.Document doc, string watermarkText)
{
// Create a watermark shape. This will be a WordArt shape.
// You are free to try other shape types as watermarks.
Aspose.Words.Drawing.Shape watermark = new Aspose.Words.Drawing.Shape(doc, Aspose.Words.Drawing.ShapeType.TextPlainText);
// Set up the text of the watermark.
watermark.TextPath.Text = watermarkText;
watermark.TextPath.FontFamily = "Arial";
watermark.Width = 500;
watermark.Height = 100;
// Text will be directed from the bottom-left to the top-right corner.
watermark.Rotation = -40;
// Remove the following two lines if you need a solid black text.
watermark.Fill.Color = System.Drawing.Color.Gray; // Try LightGray to get more Word-style watermark
watermark.StrokeColor = System.Drawing.Color.Gray; // Try LightGray to get more Word-style watermark
// Place the watermark in the page center.
watermark.RelativeHorizontalPosition = Aspose.Words.Drawing.RelativeHorizontalPosition.Page;
watermark.RelativeVerticalPosition = Aspose.Words.Drawing.RelativeVerticalPosition.Page;
watermark.WrapType = Aspose.Words.Drawing.WrapType.None;
watermark.VerticalAlignment = Aspose.Words.Drawing.VerticalAlignment.Center;
watermark.HorizontalAlignment = Aspose.Words.Drawing.HorizontalAlignment.Center;
// Create a new paragraph and append the watermark to this paragraph.
Aspose.Words.Paragraph watermarkPara = new Aspose.Words.Paragraph(doc);
watermarkPara.AppendChild(watermark);
// Insert the watermark into all headers of each document section.
foreach (Aspose.Words.Section sect in doc.Sections)
{
// There could be up to three different headers in each section, since we want
// the watermark to appear on all pages, insert into all headers.
InsertWatermarkIntoHeader(watermarkPara, sect, Aspose.Words.HeaderFooterType.HeaderPrimary);
InsertWatermarkIntoHeader(watermarkPara, sect, Aspose.Words.HeaderFooterType.HeaderFirst);
InsertWatermarkIntoHeader(watermarkPara, sect, Aspose.Words.HeaderFooterType.HeaderEven);
}
}
/// <summary>
/// Inserts a watermark into a document header.
/// </summary>
/// <param name="watermarkPara"></param>
/// <param name="sect"></param>
/// <param name="headerType"></param>
public static void InsertWatermarkIntoHeader(Aspose.Words.Paragraph watermarkPara, Aspose.Words.Section sect, Aspose.Words.HeaderFooterType headerType)
{
Aspose.Words.HeaderFooter header = sect.HeadersFooters[headerType];
if (null == header)
{
// There is no header of the specified type in the current section, create it.
header = new Aspose.Words.HeaderFooter(sect.Document, headerType);
sect.HeadersFooters.Add(header);
}
// Insert a clone of the watermark into the header.
header.AppendChild(watermarkPara.Clone(true));
}
}
}