SVN-Revision: r261
This commit is contained in:
tdx
2025-02-11 08:37:24 +00:00
parent 9cfb9ec919
commit 4d95c53cfd
3 changed files with 147 additions and 94 deletions
+144 -69
View File
@@ -20,32 +20,36 @@ namespace Lskj.AutoCreatWord
/// 数据查询对象
/// </summary>
public static Data.ADO.Abstract.AdsOperater DbOperator;
public static bool Create(string mainTempPath, string menuTempPath, string menuTempArray, DataSet dataSet, string savePath, string OAUrl, out string msg, bool createPdf = false)
public static bool Create(string mainTempPath, string menuTempPath, string menuTempArray, List<DataSet> dataSets, string savePath, string OAUrl, out string msg, bool createPdf = false)
{
msg = "";
bool result;
try
{
Document document = CreateWordUtil.InitTempDocuemnt(mainTempPath, menuTempPath, menuTempArray, dataSet);
CreateWordUtil.InitCreatBaseSql(document, dataSet, OAUrl);
CreateWordUtil.InitCreatBaseSqlDetail(document, dataSet, OAUrl);
CreateWordUtil.InitCreatTabSql(document, dataSet, OAUrl);
CreateWordUtil.InitCreatTabSqlDetail(document, dataSet, OAUrl);
CreateWordUtil.RemoveTableRow(document);
Document saveDocument = new Document();
foreach (DataSet dataSet in dataSets)
{
CreateWordUtil.InitTempDocuemnt(saveDocument, mainTempPath, menuTempPath, menuTempArray, dataSet);
CreateWordUtil.InitCreatBaseSql(saveDocument, dataSet, OAUrl);
CreateWordUtil.InitCreatBaseSqlDetail(saveDocument, dataSet, OAUrl);
CreateWordUtil.InitCreatTabSql(saveDocument, dataSet, OAUrl);
CreateWordUtil.InitCreatTabSqlDetail(saveDocument, dataSet, OAUrl);
CreateWordUtil.RemoveTableRow(saveDocument);
}
bool flag = !Directory.Exists(Path.GetDirectoryName(savePath));
if (flag)
{
Directory.CreateDirectory(Path.GetDirectoryName(savePath));
}
string fileName = Path.GetDirectoryName(savePath) + "\\" + Path.GetFileNameWithoutExtension(savePath) + ".pdf";
document.SaveToFile(savePath, FileFormat.Doc);
saveDocument.SaveToFile(savePath, FileFormat.Doc);
if (createPdf)
{
document.SaveToFile(fileName, FileFormat.PDF);
saveDocument.SaveToFile(fileName, FileFormat.PDF);
}
result = true;
document.Close();
document.Dispose();
saveDocument.Close();
saveDocument.Dispose();
msg += "生成成功";
}
catch (Exception ex)
@@ -55,22 +59,26 @@ namespace Lskj.AutoCreatWord
}
return result;
}
private static Document InitTempDocuemnt(string mainTempPath, string menuTempPath, string menuTempArray, DataSet dataSet)
private static Document InitTempDocuemnt(Document document, string mainTempPath, string menuTempPath, string menuTempArray, DataSet dataSet)
{
Document document = new Document();
Section mainSection = new Section(document);
mainSection.PageSetup.DifferentFirstPageHeaderFooter = false;
if (document == null)
{
document = new Document();
}
bool hasMainTemp = false;
document.Sections.Add(mainSection);
try
{
if (!string.IsNullOrEmpty(mainTempPath) && File.Exists(mainTempPath))
{
Section mainSection = new Section(document);
mainSection.PageSetup.DifferentFirstPageHeaderFooter = false;
document.Sections.Add(mainSection);
hasMainTemp = true;
Document document2 = new Document();
document2.LoadFromFile(mainTempPath);
foreach (Section section in document2.Sections)
{
mainSection.PageSetup.Orientation = section.PageSetup.Orientation;
mainSection.PageSetup.PageSize = section.PageSetup.PageSize;
mainSection.PageSetup.Margins = section.PageSetup.Margins;
CpoyHeaderFooter(section, mainSection, HeaderFooterType.FooterEven);
@@ -85,11 +93,17 @@ namespace Lskj.AutoCreatWord
}
}
}
else
{
Section mainSection = new Section(document);
mainSection.PageSetup.DifferentFirstPageHeaderFooter = false;
document.Sections.Add(mainSection);
}
if (!string.IsNullOrEmpty(menuTempPath) && File.Exists(menuTempPath))
{
if (hasMainTemp)
{
mainSection.PageSetup.DifferentFirstPageHeaderFooter = true;
document.LastSection.PageSetup.DifferentFirstPageHeaderFooter = true;
}
Document document3 = new Document();
document3.LoadFromFile(menuTempPath);
@@ -134,7 +148,7 @@ namespace Lskj.AutoCreatWord
{
Paragraph lastBreakParagraph = null;
DocumentObject lastBreak = null;
foreach (Paragraph paragraph in mainSection.Paragraphs)
foreach (Paragraph paragraph in document.LastSection.Paragraphs)
{
foreach (DocumentObject docObject in paragraph.ChildObjects)
{
@@ -154,15 +168,26 @@ namespace Lskj.AutoCreatWord
lastBreakParagraph.ChildObjects.Remove(lastBreak);
}
}
if (i == 0 && mainSection.Paragraphs.Count > 0)
if (i == 0 && document.LastSection.Paragraphs.Count > 0)
{
mainSection.Paragraphs[mainSection.Paragraphs.Count - 1].AppendBreak(BreakType.PageBreak);
//document.LastSection.Paragraphs[document.LastSection.Paragraphs.Count - 1].AppendBreak(BreakType.PageBreak);
}
Section section = startSelection.GetAsOneRange().OwnerParagraph.OwnerTextBody.Owner as Section;
CpoyHeaderFooter(section, mainSection, HeaderFooterType.FooterEven);
CpoyHeaderFooter(section, mainSection, HeaderFooterType.FooterOdd);
CpoyHeaderFooter(section, mainSection, HeaderFooterType.HeaderEven);
CpoyHeaderFooter(section, mainSection, HeaderFooterType.HeaderOdd);
if (section.PageSetup.Orientation != document.LastSection.PageSetup.Orientation)
{
document.LastSection.Paragraphs[document.LastSection.Paragraphs.Count - 1].InsertSectionBreak(SectionBreakType.NoBreak);
document.LastSection.PageSetup.Orientation = section.PageSetup.Orientation;
document.LastSection.PageSetup.PageSize = section.PageSetup.PageSize;
document.LastSection.PageSetup.Margins = section.PageSetup.Margins;
}
Section mainSection = document.LastSection;
if (!moduleId.Equals("yw", StringComparison.OrdinalIgnoreCase))
{
CpoyHeaderFooter(section, mainSection, HeaderFooterType.FooterEven);
CpoyHeaderFooter(section, mainSection, HeaderFooterType.FooterOdd);
CpoyHeaderFooter(section, mainSection, HeaderFooterType.HeaderEven);
CpoyHeaderFooter(section, mainSection, HeaderFooterType.HeaderOdd);
}
bool isCopying = false;
foreach (DocumentObject obj in section.Body.ChildObjects)
{
@@ -172,7 +197,9 @@ namespace Lskj.AutoCreatWord
continue; //跳过开始标记
}
if (obj == endSelection.GetAsOneRange().OwnerParagraph)
{
break; //停止复制
}
if (isCopying)
{
//将内容添加到可替换模板
@@ -225,10 +252,29 @@ namespace Lskj.AutoCreatWord
{
if (dataColumn.ColumnName.Contains("img_"))//单行替换图片
{
Image image = InitCreatImage(dataRow[dataColumn] + "", OAUrl);
if (image == null)
Image image = null;
Size size = new Size(200, 200);
string picUrl = dataRow[dataColumn] + "";
if (picUrl.StartsWith("@") && DbOperator != null)
{
image = Base64ToImage(dataRow[dataColumn] + "");
DataTable picTable = DbOperator.ExecuteDataTable(picUrl.TrimStart('@'));
if (picTable != null && picTable.Rows.Count > 0)
{
DataRow picRow = picTable.Rows[0];
string path = picRow.Table.Columns.Contains("value") ? picRow["value"] + "" : "";
int width = picRow.Table.Columns.Contains("width") && int.TryParse(picRow["width"] + "", out width) ? width : 200;
int height = picRow.Table.Columns.Contains("height") && int.TryParse(picRow["height"] + "", out height) ? height : 200;
size = new Size(width, height);
image = InitCreatImage(path, OAUrl);
}
}
else
{
image = InitCreatImage(picUrl, OAUrl);
if (image == null)
{
image = Base64ToImage(dataRow[dataColumn] + "");
}
}
// 定位到占位符的位置并替换为图片
TextSelection[] selections = document.FindAllString(item, false, true);
@@ -238,8 +284,8 @@ namespace Lskj.AutoCreatWord
{
DocPicture picture = new DocPicture(document);
picture.LoadImage(image);
picture.Width = 200;
picture.Height = 200;
picture.Width = size.Width;
picture.Height = size.Height;
// 用图片替换占位符
TextRange range = selection.GetAsOneRange();
Paragraph paragraph = range.OwnerParagraph;
@@ -347,10 +393,29 @@ namespace Lskj.AutoCreatWord
{
if (dataColumn.ColumnName.Contains("img_"))//单行替换图片
{
Image image = InitCreatImage(dataRow[dataColumn] + "", OAUrl);
if (image == null)
Image image = null;
Size size = new Size(200, 200);
string picUrl = dataRow[dataColumn] + "";
if (picUrl.StartsWith("@") && DbOperator != null)
{
image = Base64ToImage(dataRow[dataColumn] + "");
DataTable picTable = DbOperator.ExecuteDataTable(picUrl.TrimStart('@'));
if (picTable != null && picTable.Rows.Count > 0)
{
DataRow picRow = picTable.Rows[0];
string path = picRow.Table.Columns.Contains("value") ? picRow["value"] + "" : "";
int width = picRow.Table.Columns.Contains("width") && int.TryParse(picRow["width"] + "", out width) ? width : 200;
int height = picRow.Table.Columns.Contains("height") && int.TryParse(picRow["height"] + "", out height) ? height : 200;
size = new Size(width, height);
image = InitCreatImage(path, OAUrl);
}
}
else
{
image = InitCreatImage(picUrl, OAUrl);
if (image == null)
{
image = Base64ToImage(dataRow[dataColumn] + "");
}
}
// 定位到占位符的位置并替换为图片
TextSelection[] selections = document.FindAllString(item, false, true);
@@ -360,8 +425,8 @@ namespace Lskj.AutoCreatWord
{
DocPicture picture = new DocPicture(document);
picture.LoadImage(image);
picture.Width = 200;
picture.Height = 200;
picture.Width = size.Width;
picture.Height = size.Height;
// 用图片替换占位符
TextRange range = selection.GetAsOneRange();
Paragraph paragraph = range.OwnerParagraph;
@@ -432,6 +497,26 @@ namespace Lskj.AutoCreatWord
{
if (tableCell.Paragraphs.Count == 0)
{
if (disMergeDic.ContainsKey(table))
{
disMergeDic[table].Add(tableRow.Cells.IndexOf(tableCell));
}
else
{
disMergeDic.Add(table, new List<int>() { tableRow.Cells.IndexOf(tableCell) });
}
continue;
}
if (string.IsNullOrEmpty(tableCell.Paragraphs[0].Text))
{
if (disMergeDic.ContainsKey(table))
{
disMergeDic[table].Add(tableRow.Cells.IndexOf(tableCell));
}
else
{
disMergeDic.Add(table, new List<int>() { tableRow.Cells.IndexOf(tableCell) });
}
continue;
}
if (Regex.IsMatch(tableCell.Paragraphs[0].Text, pattern, RegexOptions.IgnoreCase) || Regex.IsMatch(tableCell.Paragraphs[0].Text, pattern1, RegexOptions.IgnoreCase))
@@ -747,8 +832,8 @@ namespace Lskj.AutoCreatWord
DocPicture picture = paragraph.AppendPicture(image);
picture.HorizontalAlignment = ShapeHorizontalAlignment.Center;
picture.VerticalAlignment = ShapeVerticalAlignment.Center;
picture.Width = 200;
picture.Height = 200;
picture.Width = imageSize.Width;
picture.Height = imageSize.Height;
}
else if (addRowIndex > 0)
{
@@ -849,6 +934,26 @@ namespace Lskj.AutoCreatWord
{
if (tableCell.Paragraphs.Count == 0)
{
if (disMergeDic.ContainsKey(table))
{
disMergeDic[table].Add(tableRow.Cells.IndexOf(tableCell));
}
else
{
disMergeDic.Add(table, new List<int>() { tableRow.Cells.IndexOf(tableCell) });
}
continue;
}
if (string.IsNullOrEmpty(tableCell.Paragraphs[0].Text))
{
if (disMergeDic.ContainsKey(table))
{
disMergeDic[table].Add(tableRow.Cells.IndexOf(tableCell));
}
else
{
disMergeDic.Add(table, new List<int>() { tableRow.Cells.IndexOf(tableCell) });
}
continue;
}
if (Regex.IsMatch(tableCell.Paragraphs[0].Text, pattern, RegexOptions.IgnoreCase) || Regex.IsMatch(tableCell.Paragraphs[0].Text, pattern1, RegexOptions.IgnoreCase))
@@ -1169,8 +1274,8 @@ namespace Lskj.AutoCreatWord
DocPicture picture = paragraph.AppendPicture(image);
picture.HorizontalAlignment = ShapeHorizontalAlignment.Center;
picture.VerticalAlignment = ShapeVerticalAlignment.Center;
picture.Width = 200;
picture.Height = 200;
picture.Width = imageSize.Width;
picture.Height = imageSize.Height;
}
else if (addRowIndex > 0)
{
@@ -1506,34 +1611,4 @@ namespace Lskj.AutoCreatWord
private static Image Base64ToImage(string base64String)
{
Image image = null;
try
{
if (!string.IsNullOrEmpty(base64String))
{
string pattern = @".*;base64,";
base64String = Regex.Replace(base64String, pattern, "");
byte[] imageBytes = Convert.FromBase64String(base64String);
using (var ms = new MemoryStream(imageBytes, 0, imageBytes.Length))
{
ms.Write(imageBytes, 0, imageBytes.Length);
image = Image.FromStream(ms, true);
}
}
}
catch (Exception)
{
}
return image;
}
/// <summary>
///word表格数据配置的集合
/// </summary>
protected class GridTarGet
{
public string number;
public Section targetSection;
public Table targetTable;
public int rowIndex;
}
}
}
+3 -22
View File
@@ -119,25 +119,6 @@ namespace Lskj.AutoWordFile
Task crateTask = new Task(() =>
{
AutoCreatWord.CreateWordUtil.DbOperator = new Lskj.Data.ADO.Template.DbTemplate(string.Format("server={0};database={1};persist security info=true;user id=lserpAdmin;password=lserp110;max pool size = 512;", DBConfig.Instance.ServerName, DBConfig.Instance.DataBase), "system.data.sqlclient");
AutoCreatWord.CreateWordUtil.Create(mainTempPath, menuTempPath, Model.MenuTempArray, SqlHelper.ExecuteDataSet(Model.MasterSql), savePdfPath, SystemInfo.Instance.OAUrl, out string msg);
cts.Cancel();
if (this.InvokeRequired)
{
this.Invoke(new Action(() =>
{
progressBar1.Value = 100;
Process.Start(savePdfPath);
Close();
}));
}
});
crateTask.Start();
}
catch (Exception ex)
{
MessageUtil.Show(ex.Message);
Close();
}
}
}
}
string[] masterSqls = Model.MasterSql.Trim('^').Split('^');
List<DataSet> dataSets = new List<DataSet>();
for
@@ -70,9 +70,6 @@
<Reference Include="Lskj.Util">
<HintPath>..\..\Release\Lskj.Util.dll</HintPath>
</Reference>
<Reference Include="Microsoft.QualityTools.Testing.Fakes, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="Spire.Common">
<HintPath>..\..\引用DLL\Spire.Common.dll</HintPath>
</Reference>