请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

空静

注册会员

2

主题

13

帖子

35

积分

注册会员

积分
35
最新发帖
空静
注册会员   /  发表于:2025-3-9 22:15  /   查看:138  /  回复:16
5金币
在spreadjs里面可以通过 new GC.Spread.Sheets.CellTypes.Text().getAutoFitWith(...) API获取文字长度,在GCEXCEL .NET里面并没有发现类似的API,请问老师有没有其他API可以替代。

最佳答案

查看完整内容

理解您的考虑。 经过调研,发现通过不断尝试autoFit直至单元格容纳下字符串为止再截断至下一行填充,具体代码如下所示: 上述代码生成的PDF如下图所示: 您可以尝试下看能否满足您的需求。

16 个回复

倒序浏览
最佳答案
最佳答案
Wilson.Zhang
超级版主   /  发表于:2025-3-9 22:15:35
来自 15#
空静 发表于 2025-3-10 17:24
这个方案我试过,前端生成渲染页面,导出sjs到后端导出PDF,没得问题,只是客户端维护大量数据可能不是很 ...

理解您的考虑。

经过调研,发现通过不断尝试autoFit直至单元格容纳下字符串为止再截断至下一行填充,具体代码如下所示:
  1. using GrapeCity.Documents.Excel;

  2. var wb = new Workbook();
  3. var originalColumnWidth = wb.ActiveSheet.Columns[0].ColumnWidthInPixel;
  4. string text = "君不见黄河之水天上来,奔流到海不复回。君不见高堂明镜悲白发,朝如青丝暮成雪。";

  5. double margin = 5;
  6. int row = 0;
  7. for (int start = 0, end = 1; start < text.Length && end <= text.Length;)
  8. {
  9.     string temp = text.Substring(start, end - start);
  10.     while (IsFit(wb.ActiveSheet.Range[row, 0], temp, originalColumnWidth))
  11.     {
  12.         end++;
  13.         if (end > text.Length)
  14.         {
  15.             break;
  16.         }
  17.         temp = text.Substring(start, end - start);
  18.     }
  19.     end--;
  20.     wb.ActiveSheet.Range[row, 0].Value = text.Substring(start, end - start);
  21.     start = end;
  22.     end++;
  23.     row++;
  24. }
  25. wb.ActiveSheet.Columns[0].ColumnWidthInPixel = originalColumnWidth;
  26. wb.ActiveSheet.PageSetup.PrintGridlines = true;
  27. wb.ActiveSheet.PageSetup.PrintHeadings = true;
  28. wb.Save("F:\\test.pdf");

  29. bool IsFit(IRange range, string text, double pixelWidth)
  30. {
  31.     range.Value = text;
  32.     range.AutoFit();
  33.     return range.ColumnWidthInPixel - margin < pixelWidth;
  34. }
复制代码

上述代码生成的PDF如下图所示:
1741657371806.png402791442.png

您可以尝试下看能否满足您的需求。
回复 使用道具 举报
空静
注册会员   /  发表于:2025-3-10 11:41:24
2#
今天仔细看了下文档,发现这个[color=var(--link-color)]ColumnWidth是单个character的长度(数字),也就是说 column with = 7, 能容纳 abcdefg 七个字符,但是 ABCDEFG 会超一点,中文字符 “一二三四五六七”长度得乘2,也就是14(测试出来得),具体原因得查看底层绘图引擎代码。还有一个[color=var(--link-color)]ColumnWidthInPixel像素宽度,这个结合IGraphicsInfo 来设置单个字符得像素宽度,测试结果跟前者一致
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-3-10 12:27:57
3#
您好!您可以参考如下链接中的产品文档,通过IGraphicsInfo:GetDigitWidth()测量当前单元格中文本字宽,应该也是您测试的第二种方法:
https://www.grapecity.com.cn/dev ... asure-digital-width
回复 使用道具 举报
空静
注册会员   /  发表于:2025-3-10 14:06:23
4#
Wilson.Zhang 发表于 2025-3-10 12:27
您好!您可以参考如下链接中的产品文档,通过IGraphicsInfo:GetDigitWidth()测量当前单元格中文本字宽,应 ...

老师,这个官方demo我看了,这个GetDigitWidth得返回值是自己设置得width,而不是text render完后拿到得with,感觉这个字宽还是不能精确得拿到。
回复 使用道具 举报
Lewis
初级会员   /  发表于:2025-3-10 15:11:43
5#
麻烦问一下。你获取文字长度之后,想做什么具体业务呢?是要拿到这个长度去设置列宽还是?
回复 使用道具 举报
空静
注册会员   /  发表于:2025-3-10 15:33:43
6#
Lewis 发表于 2025-3-10 15:11
麻烦问一下。你获取文字长度之后,想做什么具体业务呢?是要拿到这个长度去设置列宽还是?

有一张业务表需要文字换行,换到下一行单元格,目前配合ShrinkToFit属性,基本能够实现,不过这个我怕字体修改或者字体样式修改影响到这个with导致判断失效


1741591993320.png (660×382)
回复 使用道具 举报
空静
注册会员   /  发表于:2025-3-10 15:36:05
7#
这是效果图
1741591993320.png
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-3-10 16:09:20
8#
本帖最后由 Wilson.Zhang 于 2025-3-10 16:12 编辑
空静 发表于 2025-3-10 14:06
老师,这个官方demo我看了,这个GetDigitWidth得返回值是自己设置得width,而不是text render完后拿到得w ...

请教下您在GcExcel中设置了这种文本溢出截断至下一行填充的效果后,会将Workbook保存成什么类型的文件?ssjson、sjs、excel和PDF哪些?
回复 使用道具 举报
空静
注册会员   /  发表于:2025-3-10 16:19:24
9#
Wilson.Zhang 发表于 2025-3-10 16:09
请教下您在GcExcel中设置了这种文本溢出截断至下一行填充的效果后,会将Workbook保存成什么类型的文件?s ...

主要是PDF,然后这个效果我发现中文上下居中感觉还是偏上一小点,代码是设置过的 worksheet.Range[rowIndex, 1].Style.VerticalAlignment = VerticalAlignment.Center;
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部