You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用PdfFileWriter生成PdfTable时单元格自动换行实现方案问询

解决方案

核心配置(无需手动拆分字符串)

你所用的PdfTable组件原生支持自动换行和行高自适应,只需补充3项配置即可解决内容溢出问题:

  • 开启单元格自动换行属性:分别给全局默认单元格样式、表头样式启用WordWrap,文字到达列宽边界后会自动换行
  • 开启行高自动适配:设置AutoRowHeight为true,表格会根据每行内容的实际高度自动调整行高,不会出现内容超出单元格的情况
  • 可选配置单元格内边距:避免换行后的文字紧贴单元格边框,提升可读性

在你现有表格初始化代码中补充配置即可:

PdfContents contentsTable = new PdfContents(page);

PdfTable table = new PdfTable(page, contentsTable, ArialNormal, fontSize);
table.TableArea = new PdfRectangle(border (2 * border + fontHight), (210 - border), (297 - (2 * border + 4 * linespacing + 5 * fontHight)));
table.SetColumnWidth(30, 75, 35, 10, 30, 22, 8);
table.HeaderOnEachPage = true;
table.MinRowHight = 5;

// 新增以下配置
// 开启自动换行
table.DefaultCellStyle.WordWrap = true;
table.HeaderStyle.WordWrap = true;
// 开启行高自动适配
table.AutoSizeRowHeight = true;
// 可选:设置单元格内边距,参数按自己使用的库调整即可
table.DefaultCellStyle.Padding = new PdfPadding(2, 2, 1, 1);

// 原有表头配置不变
table.Header[0].Style = table.HeaderStyle;
// ......其余表头配置保持不变

代码遗漏修复

你现有代码的while循环中,给所有单元格赋值完成后缺少新增行的调用,这也是导致行高计算失效的常见原因,补充对应方法即可:

while (reader.Read())
{
    table.Cell[0].Value = reader[0].ToString();
    table.Cell[1].Value = reader[1].ToString();
    table.Cell[2].Value = reader[2].ToString();
    table.Cell[3].Value = reader[3].ToString();
    table.Cell[4].Value = reader[4].ToString();
    table.Cell[5].Value = reader[5].ToString();
    table.Cell[6].Value = reader[6].ToString();
    // 新增:将当前行加入表格,触发行高计算
    table.AddRow();
}

额外问题提醒

你现有SQL语句存在逻辑错误,表关联条件不应该用and开头,应该替换为where,否则会产生笛卡尔积,返回大量无效重复数据:

command.CommandText = "select A.CODE, A.BESCHERIBUNG, A.MATERIALNAME, R.NORMFLAG, R.ERGEBNIST, R.BEWERTUNG, R.ART " +
"from ANALYT A, RESULTS R " +
"where A.ANALYTX = R.ANALYTX " + // 把原有and改成where
"order by A.MATERIALNAME desc, R.SORT ";

极端场景兼容

如果存在无空格的超长连续字符串(比如无分隔符的超长编号),自动换行不会生效,这时可以写个简单的辅助方法,按列宽允许的字符长度插入软换行符,不需要手动拆分多行:

// 辅助方法:给超长无空格字符串插入软换行
private string InsertSoftWrap(string input, int maxCharPerLine)
{
    if (string.IsNullOrEmpty(input) || input.Length <= maxCharPerLine)
        return input;
    return string.Join("\u200B", Enumerable.Range(0, input.Length / maxCharPerLine + 1)
        .Select(i => input.Substring(i * maxCharPerLine, Math.Min(maxCharPerLine, input.Length - i * maxCharPerLine))));
}

调用时直接给单元格值套一层方法即可,maxCharPerLine可以根据列宽和字体大小调整,比如30宽度的列对应12个字符左右。

内容的提问来源于stack exchange,提问作者Samuel Skorsetz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:18:00