Richard.Ma 发表于 2022-3-31 09:46:14

【GCEXCEL】通过页面关键字实现精确分页

GCExcel提供了导出PDF的功能,我们可以以此将Excel文件导出为PDF报告在一些场景下,由于报告中每页的内容高度并不相同,如果使用GCExcel自己的分页功能,并不是我们最终想要的结果,这个时候通过代码判断对Sheet进行分割来达到分页的效果是一个不错的选择


以下是一个使用产品较多的质量检测行业,导出质检报告的例子。
下图是报告结果内容示例,可以看到这个sheet中实际内容是3页检测结果,且每页的内容高度不同,如果直接导出pdf,分页会发生混乱。



但是可以看到由于检测报告每页的内容有相同的地方,比如每页结果部分都是以“证书编号”作为头部开始,通过这个关键字来进行定位,分割每页的区域到一个新的sheet,然后进行打印,就实现了精确分页
下面是具体的代码以及项目附件,此dmeo以.NET版本为例,JAVA版页可以进行参考




using GrapeCity.Documents.Excel;
using System.Diagnostics;

Workbook workbook= new Workbook();
workbook.Open("Result.xlsx");

var innersheet = workbook.Worksheets;
int usedrow = innersheet.UsedRange.LastRow;
int usedCol = innersheet.UsedRange.LastColumn;
IRange startrange = innersheet.Range["A1"];
IRange endrange = innersheet.Range["A1"];

int FirstCnoRow = 0;//第一个找到编号字符的行
int FindTime = 0;//查找次数

//根据'证书编号'关键字分页,
string pageSeparateKeyword = "证书编号";
int pagenum = 1;


while (true)
{

    startrange = endrange;
    endrange = innersheet.UsedRange.Find(pageSeparateKeyword, endrange);

    if (FindTime == 0)
    {
      FirstCnoRow = endrange.Row;
    }
    FindTime++;

    if (endrange == null)
    {
      //复制到新的Sheet后删除多余部分,此Page页成为一个单独sheet
      var lastsheet = innersheet.Copy();
      if (startrange.Row - (FirstCnoRow) > 0)
      {
            lastsheet.Range[(FirstCnoRow), 0, startrange.Row - (FirstCnoRow), 1].EntireRow.Delete();
      }

      //设置该sheet的页面属性,自适应以确保会打印到1页中
      lastsheet.PageSetup.IsPercentScale = false;
      lastsheet.PageSetup.FitToPagesTall = 1;
      lastsheet.PageSetup.FitToPagesWide = 1;


      pagenum++;

      break;
    }
    if (startrange.Row != 0)
    {
      //复制到新的Sheet后删除多余部分,此Page页成为一个单独sheet
      var lastsheet = innersheet.Copy();
      if (usedrow - (FirstCnoRow) > 0)
      {
            lastsheet.Range.EntireRow.Delete();
      }
      if (startrange.Row - (FirstCnoRow) > 0)
            lastsheet.Range[(FirstCnoRow), 0, startrange.Row - (FirstCnoRow), 1].EntireRow.Delete();

      //设置该sheet的页面属性,自适应以确保会打印到1页中
      lastsheet.PageSetup.IsPercentScale = false;
      lastsheet.PageSetup.FitToPagesTall = 1;
      lastsheet.PageSetup.FitToPagesWide = 1;


      pagenum++;
    }
}
//删除原有的完整Sheet
innersheet.Delete();

//替换实际页码
for(int i = 0; i <workbook.Worksheets.Count;i++)
{
    workbook.Worksheets.UsedRange.Replace("&P", i+1);
    workbook.Worksheets.UsedRange.Replace("&N", workbook.Worksheets.Count);
}


workbook.Save("XXX质检报告结果.pdf");
Process.Start(Path.Combine( Environment.CurrentDirectory, "XXX质检报告结果.pdf"));




页: [1]
查看完整版本: 【GCEXCEL】通过页面关键字实现精确分页