找回密码
 立即注册

QQ登录

只需一步,快速开始

jiankeyan

中级会员

98

主题

268

帖子

796

积分

中级会员

积分
796
jiankeyan
中级会员   /  发表于:2021-7-26 10:33  /   查看:1991  /  回复:8
本帖最后由 Richard.Ma 于 2021-8-2 18:19 编辑

https://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=89950
我们用了这个帖子的方式 别的表格基本没问题但是这个表格由于列数过多的情况 导致边距差很多


请问 有什么方法可以处理吗?

json.ssjson

683.74 KB, 下载次数: 11

8 个回复

倒序浏览
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-7-26 17:22:47
推荐
明白了,你是要扩大列宽以填满除边距外的空白区域,
这个代码目前产生问题的原因是还是咱们之前沟通过的,过窄的列宽时,取到的ColumnWidth是0,导致很多列宽度实际没有放大,可以改用ColumnWidthInPixel,进行同样的判断和计算,这里因为存在一些计算误差,因此在列宽放大后,再重新去算一次比例,然后去设置,避免超出1页,下面是修改的代码和最终效果



  1. var worksheet = workbook.Worksheets[0];
  2.             int rowCount = worksheet.UsedRange.RowCount;//获取行数
  3.             int colCount = worksheet.UsedRange.ColumnCount;//获取列数
  4.             IRange searchScope = worksheet.UsedRange;

  5.             var size = new PrintManager().GetSize(worksheet.UsedRange);
  6.             worksheet.PageSetup.PaperSize = GrapeCity.Documents.Excel.PaperSize.A4;//a4纸
  7.             worksheet.PageSetup.FitToPagesWide = 1;
  8.             worksheet.PageSetup.FitToPagesTall = 1;
  9.             worksheet.PageSetup.IsPercentScale = true;

  10.             double paperwidth = 0;
  11.             double paperheight = 0;

  12.             //宽度小于高度  竖版表格
  13.             if (size.Width < size.Height)
  14.             {
  15.                 worksheet.PageSetup.Orientation = GrapeCity.Documents.Excel.PageOrientation.Portrait;
  16.                 worksheet.PageSetup.LeftMargin = 25 / 25.4 * 72;
  17.                 worksheet.PageSetup.TopMargin = 15 / 25.4 * 72;
  18.                 worksheet.PageSetup.RightMargin = 15 / 25.4 * 72;
  19.                 worksheet.PageSetup.BottomMargin = 15 / 25.4 * 72;

  20.                 //以A4纸宽度为例,转毫米为point,
  21.                 paperwidth = 210 / 25.4 * 72 - worksheet.PageSetup.LeftMargin - worksheet.PageSetup.RightMargin;
  22.                 paperheight = 297 / 25.4 * 72 - worksheet.PageSetup.TopMargin - worksheet.PageSetup.BottomMargin;

  23.             }
  24.             else//横版表格
  25.             {
  26.                 worksheet.PageSetup.Orientation = GrapeCity.Documents.Excel.PageOrientation.Landscape;
  27.                 worksheet.PageSetup.LeftMargin = 15 / 25.4 * 72;
  28.                 worksheet.PageSetup.TopMargin = 25 / 25.4 * 72;
  29.                 worksheet.PageSetup.RightMargin = 15 / 25.4 * 72;
  30.                 worksheet.PageSetup.BottomMargin = 15 / 25.4 * 72;

  31.                 //以A4纸宽度为例,转毫米为point,
  32.                 paperwidth = 297 / 25.4 * 72 - worksheet.PageSetup.LeftMargin - worksheet.PageSetup.RightMargin;
  33.                 paperheight = 210 / 25.4 * 72 - worksheet.PageSetup.TopMargin - worksheet.PageSetup.BottomMargin;
  34.             }
  35.             //计算缩放比例
  36.             int zoomx = (int)(paperwidth / size.Width * 100);
  37.             int zoomy = (int)(paperheight / size.Height * 100);
  38.             if (zoomx > zoomy)
  39.             {
  40.                 double scalex = (double)zoomx / zoomy;
  41.                 for (int c = 0; c < worksheet.UsedRange.ColumnCount; c++)
  42.                 {
  43.                     var df = worksheet.Columns[c];
  44.                     if (worksheet.Columns[c].ColumnWidthInPixel != 0)
  45.                         worksheet.Columns[c].ColumnWidthInPixel = worksheet.Columns[c].ColumnWidthInPixel * scalex;
  46.                 }
  47.             }
  48.             else
  49.             {
  50.                 double scaley = (double)zoomy / zoomx;
  51.                 for (int r = 0; r < worksheet.Rows.Count; r++)
  52.                 {
  53.                     if (worksheet.Rows[r].RowHeight != 0)
  54.                         worksheet.Rows[r].RowHeight = worksheet.Rows[r].RowHeight * scaley;
  55.                 }
  56.             }
  57.             size = new PrintManager().GetSize(worksheet.UsedRange);
  58.             zoomx = (int)(paperwidth / size.Width * 100);
  59.             zoomy = (int)(paperheight / size.Height * 100);
  60.             worksheet.PageSetup.Zoom = zoomx > zoomy ? zoomy : zoomx;
复制代码



image.png970542907.png

回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-7-26 10:53:34
沙发
本帖最后由 Richard.Ma 于 2021-7-26 11:42 编辑

你说的边距差很多是指什么意思,我测试目前默认设置下会导出为4页pdf,


你期望的导出效果是怎样的?
image.png799661559.png
回复 使用道具 举报
jiankeyan
中级会员   /  发表于:2021-7-26 11:04:18
板凳
Richard.Ma 发表于 2021-7-26 10:53
你说的边距差很多是指什么意思,我测试目前默认设置下会导出为4页pdf,使用之前给你提供的缩放到1页的代码 ...

我期望的效果是导出到一页上,然后宽度和高度都等比例缩放,左右边距一样,上下边距一样
回复 使用道具 举报
jiankeyan
中级会员   /  发表于:2021-7-26 11:15:56
地板
image.png510710143.png
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-7-26 11:41:30
5#
宽度和高度都等比例缩放,这个之前咱们帖子中讨论的代码已经没有问题了,

之前讨论的代码是分别计算宽高的缩放比例,按照较小的那个比例设置缩放,比如这个表格,会按照高度进行缩放比例为64%(上下左右边距都设置为0)。

  1.             var worksheet = workbook.Worksheets[0];
  2.             worksheet.PageSetup.PaperSize = GrapeCity.Documents.Excel.PaperSize.A4;
  3.             worksheet.PageSetup.LeftMargin = 0;
  4.             worksheet.PageSetup.TopMargin = 0;
  5.             worksheet.PageSetup.RightMargin = 0;
  6.             worksheet.PageSetup.BottomMargin = 0;
  7.             //将表格缩小到一张纸中打印
  8.             worksheet.PageSetup.FitToPagesTall = 1;
  9.             worksheet.PageSetup.FitToPagesWide = 1;
  10.            
  11.             //获取打印区域的原始宽高
  12.             var size = new PrintManager().GetSize(worksheet.UsedRange);
  13.             //以A4纸宽度为例,转毫米为point,
  14.             double paperwidth = 210 / 25.4 * 72 - worksheet.PageSetup.LeftMargin- worksheet.PageSetup.RightMargin;
  15.             double paperheight = 297 / 25.4 * 72 - worksheet.PageSetup.TopMargin - worksheet.PageSetup.BottomMargin;

  16.             //计算缩放比例
  17.             //按宽度
  18.             int zoomW = (int)(paperwidth / size.Width * 100);
  19.             //按高度
  20.             int zoomH = (int)(paperheight / size.Height * 100);
  21.             //设置缩放比例,取更小比例
  22.             worksheet.PageSetup.Zoom = zoomW> zoomH?zoomH:zoomW;
复制代码

也就是说高度撑满,宽度会有剩余,默认会靠左显示,如下图



下一步需要做的也就计算一个左边距,以将左右居中
可以用以下代码
  1. worksheet.PageSetup.LeftMargin = paperwidth*(1-zoomH/100.0)/2;
复制代码


最终效果如下,如果上下左右本来就需要设置一定的最小边距,比如此例中需要设置一些上下边距的话,在第一步设置后再进行比例计算就行



回复 使用道具 举报
jiankeyan
中级会员   /  发表于:2021-7-26 15:33:47
6#
Richard.Ma 发表于 2021-7-26 11:41
宽度和高度都等比例缩放,这个之前咱们帖子中讨论的代码已经没有问题了,

之前讨论的代码是分别计算宽高 ...

不好意思,上面我说的可能不严谨,我们导出的上下左右边距是有固定值的,在A4纸上大概是左边距2.5厘米,其他边距为1.5厘米,我们期望的就是整个sheet页能缩放到这个区域内。用了您之前的方法,确实解决了之前大部分表格问题,最近发现这种列特别多的导出就有问题。
下面是我们的代码:
  1. var worksheet = wook.Worksheets[0];
  2.                         int rowCount = worksheet.UsedRange.RowCount;//获取行数
  3.                         int colCount = worksheet.UsedRange.ColumnCount;//获取列数
  4.                         IRange searchScope = worksheet.UsedRange;

  5.                         var size = new PrintManager().GetSize(worksheet.UsedRange);
  6.                         worksheet.PageSetup.PaperSize = PaperSize.A4;//a4纸
  7.                         worksheet.PageSetup.FitToPagesWide = 1;
  8.                         worksheet.PageSetup.FitToPagesTall = 1;
  9.                         worksheet.PageSetup.IsPercentScale = true;

  10.                         double paperwidth = 0;
  11.                         double paperheight = 0;

  12.                         //宽度小于高度  竖版表格
  13.                         if (size.Width < size.Height)
  14.                         {
  15.                             worksheet.PageSetup.Orientation = PageOrientation.Portrait;
  16.                             worksheet.PageSetup.LeftMargin = 25 / 25.4 * 72;
  17.                             worksheet.PageSetup.TopMargin = 15 / 25.4 * 72;
  18.                             worksheet.PageSetup.RightMargin = 15 / 25.4 * 72;
  19.                             worksheet.PageSetup.BottomMargin = 15 / 25.4 * 72;

  20.                             //以A4纸宽度为例,转毫米为point,
  21.                             paperwidth = 210 / 25.4 * 72 - worksheet.PageSetup.LeftMargin - worksheet.PageSetup.RightMargin;
  22.                             paperheight = 297 / 25.4 * 72 - worksheet.PageSetup.TopMargin - worksheet.PageSetup.BottomMargin;

  23.                         }
  24.                         else//横版表格
  25.                         {
  26.                             worksheet.PageSetup.Orientation = PageOrientation.Landscape;
  27.                             worksheet.PageSetup.LeftMargin = 15 / 25.4 * 72;
  28.                             worksheet.PageSetup.TopMargin = 25 / 25.4 * 72;
  29.                             worksheet.PageSetup.RightMargin = 15 / 25.4 * 72;
  30.                             worksheet.PageSetup.BottomMargin = 15 / 25.4 * 72;

  31.                             //以A4纸宽度为例,转毫米为point,
  32.                             paperwidth = 297 / 25.4 * 72 - worksheet.PageSetup.LeftMargin - worksheet.PageSetup.RightMargin;
  33.                             paperheight = 210 / 25.4 * 72 - worksheet.PageSetup.TopMargin - worksheet.PageSetup.BottomMargin;
  34. }
  35.                         //计算缩放比例
  36.                         int zoomx = (int)(paperwidth / size.Width * 100);
  37.                         int zoomy = (int)(paperheight / size.Height * 100);
  38.                         if (zoomx > zoomy)
  39.                         {
  40.                             double scalex = (double)zoomx / zoomy;
  41.                             for (int c = 0; c < worksheet.Columns.Count; c++)
  42.                             {
  43.                                 if (worksheet.Columns[c].ColumnWidth != 0)
  44.                                     worksheet.Columns[c].ColumnWidth = worksheet.Columns[c].ColumnWidth * scalex;
  45. }
  46.                         }
  47.                         else
  48.                         {
  49.                             double scaley = (double)zoomy / zoomx;
  50.                             for (int r = 0; r < worksheet.Rows.Count; r++)
  51.                             {
  52.                                 if (worksheet.Rows[r].RowHeight != 0)
  53.                                     worksheet.Rows[r].RowHeight = worksheet.Rows[r].RowHeight * scaley;
  54.                             }
  55.                         }
  56.                         worksheet.PageSetup.Zoom = zoomx > zoomy ? zoomy : zoomx;
复制代码


回复 使用道具 举报
jiankeyan
中级会员   /  发表于:2021-7-27 17:33:13
8#
Richard.Ma 发表于 2021-7-26 17:22
明白了,你是要扩大列宽以填满除边距外的空白区域,
这个代码目前产生问题的原因是还是咱们之前沟通过的, ...

谢谢
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-7-27 17:35:18
9#

有新问题欢迎开新帖交流~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部