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
相关产品推荐
相关产品推荐

