using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DocTools.Dtos;
namespace DocTools.DBDoc
{
public class ExcelDoc : Doc
{
public ExcelDoc(DBDto dto, string filter = "excel files (.xlsx)|*.xlsx") : base(dto, filter)
{
}
public override void Build(string filePath)
{
ExcelUtils.ExportExcelByEpplus(filePath, this.Dto);
}
}
///
/// Excel处理工具类
///
internal static class ExcelUtils
{
///
/// 引用EPPlus.dll导出excel数据库字典文档
///
///
///
///
public static void ExportExcelByEpplus(string fileName, DBDto dto)
{
var tables = dto.Tables;
System.IO.FileInfo xlsFileInfo = new System.IO.FileInfo(fileName);
if (xlsFileInfo.Exists)
{
// 注意此处:存在Excel文档即删除再创建一个
xlsFileInfo.Delete();
xlsFileInfo = new System.IO.FileInfo(fileName);
}
// 创建并添加Excel文档信息
using (OfficeOpenXml.ExcelPackage epck = new OfficeOpenXml.ExcelPackage(xlsFileInfo))
{
// 创建overview sheet
CreateLogSheet(epck, AppConst.LOG_CHAPTER_NAME, tables);
// 创建overview sheet
CreateOverviewSheet(epck, AppConst.TABLE_CHAPTER_NAME, tables);
// 创建tables sheet
CreateTableSheet(epck, AppConst.TABLE_STRUCTURE_CHAPTER_NAME, tables);
epck.Save(); // 保存excel
epck.Dispose();
}
}
///
/// 创建修订日志sheet
///
///
///
///
private static void CreateLogSheet(OfficeOpenXml.ExcelPackage epck, string sheetName, List tables)
{
OfficeOpenXml.ExcelWorksheet overviewTbWorksheet = epck.Workbook.Worksheets.Add(sheetName);
int row = 1;
overviewTbWorksheet.Cells[row, 1, row, 5].Merge = true;
//overviewTbWorksheet.Cells[row, 1].Value = "总表数量";
//overviewTbWorksheet.Cells[row, 2].Value = tables.Count + "";
//overviewTbWorksheet.Cells[row, 4].Value = "密码等级";
//overviewTbWorksheet.Cells[row, 5].Value = "秘密";
row++; // 行号+1
overviewTbWorksheet.Cells[row, 1].Value = "版本号";
overviewTbWorksheet.Cells[row, 2].Value = "修订日期";
overviewTbWorksheet.Cells[row, 3].Value = "修订内容";
overviewTbWorksheet.Cells[row, 4].Value = "修订人";
overviewTbWorksheet.Cells[row, 5].Value = "审核人";
overviewTbWorksheet.Cells[row, 1, row, 5].Style.Font.Bold = true;
overviewTbWorksheet.Cells[row, 1, row, 5].Style.Font.Size = 10;
overviewTbWorksheet.Row(1).Height = 20; // 行高
// 循环日志记录
row++; // 行号+1
for (var i = 0; i < 16; i++)
{
// 添加列标题
overviewTbWorksheet.Cells[row, 1].Value = "";
overviewTbWorksheet.Cells[row, 2].Value = "";
overviewTbWorksheet.Cells[row, 3].Value = "";
overviewTbWorksheet.Cells[row, 4].Value = "";
overviewTbWorksheet.Cells[row, 5].Value = "";
overviewTbWorksheet.Row(row).Height = 20; // 行高
row++; // 行号+1
}
// 水平居中
overviewTbWorksheet.Cells[1, 1, row - 1, 5].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
// 垂直居中
overviewTbWorksheet.Cells[1, 1, row - 1, 5].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center;
// 上下左右边框线
overviewTbWorksheet.Cells[1, 1, row - 1, 5].Style.Border.Top.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
overviewTbWorksheet.Cells[1, 1, row - 1, 5].Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
overviewTbWorksheet.Cells[1, 1, row - 1, 5].Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
overviewTbWorksheet.Cells[1, 1, row - 1, 5].Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
overviewTbWorksheet.Column(1).Width = 25;
overviewTbWorksheet.Column(2).Width = 25;
overviewTbWorksheet.Column(3).Width = 50;
overviewTbWorksheet.Column(4).Width = 25;
overviewTbWorksheet.Column(5).Width = 25;
}
///
/// 创建表目录sheet
///
///
///
///
private static void CreateOverviewSheet(OfficeOpenXml.ExcelPackage epck, string sheetName, List tables)
{
OfficeOpenXml.ExcelWorksheet overviewTbWorksheet = epck.Workbook.Worksheets.Add(sheetName);
int row = 1;
overviewTbWorksheet.Cells[row, 1].Value = "序号";
overviewTbWorksheet.Cells[row, 2].Value = "表名";
overviewTbWorksheet.Cells[row, 3].Value = "注释/说明";
overviewTbWorksheet.Cells[row, 1, row, 3].Style.Font.Bold = true;
overviewTbWorksheet.Cells[row, 1, row, 3].Style.Font.Size = 16;
overviewTbWorksheet.Row(1).Height = 30; // 行高
// 循环数据库表名
row++;
foreach (var table in tables)
{
// 数据库名称
// 添加列标题
overviewTbWorksheet.Cells[row, 1].Value = table.TableOrder;
overviewTbWorksheet.Cells[row, 2].Value = table.TableName;
overviewTbWorksheet.Cells[row, 3].Value = (!string.IsNullOrWhiteSpace(table.Comment) ? table.Comment : "");
overviewTbWorksheet.Row(row).Height = 30; // 行高
row++; // 行号+1
}
// 水平居中
overviewTbWorksheet.Cells[1, 1, row - 1, 3].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
// 垂直居中
overviewTbWorksheet.Cells[1, 1, row - 1, 3].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center;
// 上下左右边框线
overviewTbWorksheet.Cells[1, 1, row - 1, 3].Style.Border.Top.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
overviewTbWorksheet.Cells[1, 1, row - 1, 3].Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
overviewTbWorksheet.Cells[1, 1, row - 1, 3].Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
overviewTbWorksheet.Cells[1, 1, row - 1, 3].Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
overviewTbWorksheet.Column(1).Width = 10;
overviewTbWorksheet.Column(2).Width = 50;
overviewTbWorksheet.Column(3).Width = 50;
}
///
/// 创建表结构sheet
///
///
///
///
private static void CreateTableSheet(OfficeOpenXml.ExcelPackage epck, string sheetName, List tables)
{
OfficeOpenXml.ExcelWorksheet tbWorksheet = epck.Workbook.Worksheets.Add(sheetName);
int rowNum = 1, fromRow = 0, count = 0; // 行号计数器
// 循环数据库表名
foreach (var table in tables)
{
var lstName = new List
{
"序号","列名","数据类型","长度","小数位","主键","自增","允许空","默认值","列说明"
};
//oracle不显示 列是否自增
if (table.DBType.StartsWith("Oracle"))
{
lstName.Remove("自增");
}
var spColCount = lstName.Count;
// 数据库名称
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Merge = true;
tbWorksheet.Cells[rowNum, 1].Value = table.TableName + " " + (!string.IsNullOrWhiteSpace(table.Comment) ? table.Comment : "");
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.Font.Bold = true;
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.Font.Size = 16;
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center;
// 注意:保存起始行号
fromRow = rowNum;
rowNum++; // 行号+1
// tbWorksheet.Cells[int FromRow, int FromCol, int ToRow, int ToCol]
// 列标题字体为粗体
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.Font.Bold = true;
// 添加列标题
for (int j = 0; j < lstName.Count; j++)
{
tbWorksheet.Cells[rowNum, j + 1].Value = lstName[j];
}
rowNum++; // 行号+1
// 添加数据行,遍历数据库表字段
foreach (var column in table.Columns)
{
tbWorksheet.Cells[rowNum, 1].Value = column.ColumnOrder;
tbWorksheet.Cells[rowNum, 2].Value = column.ColumnName;
tbWorksheet.Cells[rowNum, 3].Value = column.ColumnTypeName;
tbWorksheet.Cells[rowNum, 4].Value = column.Length;
tbWorksheet.Cells[rowNum, 5].Value = column.Scale;
tbWorksheet.Cells[rowNum, 6].Value = column.IsPK;
//oracle不显示 列是否自增
if (table.DBType.StartsWith("Oracle"))
{
tbWorksheet.Cells[rowNum, 7].Value = column.CanNull;
tbWorksheet.Cells[rowNum, 8].Value = column.DefaultVal;
tbWorksheet.Cells[rowNum, 9].Value = column.Comment;
}
else
{
tbWorksheet.Cells[rowNum, 7].Value = column.IsIdentity;
tbWorksheet.Cells[rowNum, 8].Value = column.CanNull;
tbWorksheet.Cells[rowNum, 9].Value = column.DefaultVal;
tbWorksheet.Cells[rowNum, 10].Value = column.Comment;
}
rowNum++; // 行号+1
}
// 水平居中
tbWorksheet.Cells[fromRow, 1, rowNum - 1, spColCount].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
// 垂直居中
tbWorksheet.Cells[fromRow, 1, rowNum - 1, spColCount].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center;
// 上下左右边框线
tbWorksheet.Cells[fromRow, 1, rowNum - 1, spColCount].Style.Border.Top.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
tbWorksheet.Cells[fromRow, 1, rowNum - 1, spColCount].Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
tbWorksheet.Cells[fromRow, 1, rowNum - 1, spColCount].Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
tbWorksheet.Cells[fromRow, 1, rowNum - 1, spColCount].Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
// 处理空白行,分割用
if (count < tables.Count - 1)
{
//tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.Border.Top.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
//tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Merge = true;
tbWorksheet.Cells[rowNum, 1, rowNum, 1].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
tbWorksheet.Cells[rowNum, 1, rowNum, 1].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.DodgerBlue);
}
rowNum++; // 行号+1
count++; // 计数器+1
}
// 设置表格样式
tbWorksheet.Cells.Style.WrapText = true; // 自动换行
tbWorksheet.Cells.Style.ShrinkToFit = true; // 单元格自动适应大小
}
}
}