有没有办法在 C# 中使用 OpenXml 库来固定列的宽度?

问题描述 投票:0回答:3

我有一个包含 2 列的 Word 表格。 我试图让 Word 在第 2 列有长文本换行时不要挤压第 1 列。

这是预期的布局:

 第 1 列 第 2 列                
 -------- --------                
 1. 长文本换行   
           几次。     
           另一段   
           换行的长文本。  

 2. 更长的文字    
           再次包裹。           
           还有另外一段 
           长换行文本。 

注意第 2 列每个单元格中有 2 个段落。 不确定这是否重要,但这就是其中必须包含的内容。

当表格行数达到两位数并且我以编程方式将完成的文档发送到客户端站点上的浏览器(他们将其视为下载并在 Word 中打开)后,会发生以下情况:

 第 1 列 第 2 列                
 -------- --------                
 。         。
 。         。

 9. 长文本换行   
           几次。     
           另一段   
           换行的长文本。  

 1 更长的文本    
 0. 再次换行。           
           还有另外一段 
           长换行文本。 

 1 更长的文本    
 1. 再次包裹。           
           还有另外一段 
           长换行文本。 

注意“10”。和“11”。在第 1 列中被换行(因为 Word 决定挤压该列的宽度,...我认为)

我尝试增加 GridColumn 宽度(甚至增加到一个很大的值),但没有成功。 Word 似乎总是将列宽重新调整为它认为最合适的大小......我认为。 我在其他论坛(不是 Microsoft 网站)上读到,所有宽度设置都仅被视为“首选”。 不确定这是否属实,但在这种情况下似乎足够正确!!

我尝试过设置

new TableCellProperties()
{
  Width = "4000",
  Type = TableWidthUnitValues.Pct
}

还有

{
  Width = "3170",
  Type = TableWidthUnitValues.Dxa
}

我也尝试过将表格布局设置为固定:

类型 = TableLayoutValues.Fixed

同时在表格属性中将表格单元格边距和TableCellSpacing设置为0;但没有任何帮助。

是否有任何 OpenXml API 可以告诉 Word 不要弄乱列的宽度?

c# openxml-sdk
3个回答
7
投票

我遇到了同样的问题,但我可以使用 TableLayout 属性来做到这一点。

// First, we create the table, its properties and we append it.
Table table = new Table();
TableProperties props = new TableProperties();
table.AppendChild<TableProperties>(props);

// Now we create a new layout and make it "fixed".
TableLayout tl = new TableLayout(){ Type = TableLayoutValues.Fixed };
props.TableLayout = tl;

// Then we just create a new row and a few cells and we give them a width
var tr = new TableRow();
var tc1 = new TableCell();
var tc2 = new TableCell();
tc1.Append(new TableCellProperties(new TableCellWidth() { Type = TableWidthUnitValues.Dxa, Width = "2000" }));
tc2.Append(new TableCellProperties(new TableCellWidth() { Type = TableWidthUnitValues.Dxa, Width = "2000" }));
table.Append(tr);

现在,当我们向表格添加文本时,不再重新缩放。


4
投票

对于那些有兴趣的人,我终于解决了这个问题。

解决方案是完全放弃表对象。 相反,我只依赖段落。

网上有很多讨论明确提到Word中表格对象的列宽无法通过OpenXml精确控制。 我不确定这是否属实,但正如我在上面的问题中提到的,我尝试的任何方法都没有帮助。 在使用 OpenXml SDK 工具从中提取代码之前,甚至没有修复 Word 本身的宽度。 也没有人提供具体的替代方案。

但是,使用带有缩进和对齐对象的段落并嵌入制表符,将段落的内容分成 2 个“列”,其中右列准确地缩进。 给我确切想要的结果,如上问题中的表格所示。 也没有挤压第 1 列。


0
投票

我使用此代码来调整特定列的宽度,而所有其他列都会根据其内容自动调整。

Table tbl = new Table();

TableProperties tableProp = new TableProperties();
TableStyle tableStyle = new TableStyle() { Val = "TableGrid" };

// Make the table width 100% of the page width.
TableWidth tableWidth = new TableWidth() { Width = "5000", Type = TableWidthUnitValues.Pct };

tableProp.Append(tableStyle, tableWidth);

tbl.AppendChild(tableProp);

//Add n columns to table
TableGrid tg = new TableGrid(new GridColumn(), new GridColumn());

tbl.AppendChild(tg);

TableRow tr1 = new TableRow();

//I Manually adjust width of the first column
TableCell tc1 = new TableCell(GenerateTableCellPropsWithWidth("270"), new Paragraph(new Run(new Text("№"))));

//All other column are adjusted based on their content
TableCell tc2 = new TableCell(GenerateTableCellPropsWithWidth(), new Paragraph(new Run(new Text("Title"))));

tr1.Append(tc1, tc2);
tbl.AppendChild(tr1);

//This method is only used for headers, while regular rows cells contain no TableCellProperties
private TableCellProperties GenerateTableCellPropsWithWidth(string width = null)
{
    TableCellProperties tcp = new TableCellProperties();
    tcp.AppendChild(string.IsNullOrEmpty(width)
        ? new TableCellWidth {Type = TableWidthUnitValues.Auto}
        : new TableCellWidth {Type = TableWidthUnitValues.Pct, Width = width});
    return tcp;
}
© www.soinside.com 2019 - 2024. All rights reserved.