如何使用 Open XML SDK 在 Word table 的空白单元格中设置字体大小?
How to set font size in empty cell of a Word table using the Open XML SDK?
我正在使用 C# 在 Word 文件中使用 OpenXml 创建一个 table。我使用 问题中提到的一些代码来设置单元格中文本的字体大小。它适用于包含文本的单元格,但空单元格似乎被赋予了正常样式,并且字体更大,这使得行高更大。
这是我的示例代码,单行单单元格,字体大小应为 9:
TableRow tr = new TableRow();
TableCell tc = new TableCell();
Paragraph par = new Paragraph();
Run run = new Run();
Text txt = new Text("txt");
RunProperties runProps = new RunProperties();
FontSize fontSize = new Fontsize() { Val = "18" }; // font size 9
runProps.Append(fontSize);
run.Append(runProps);
run.Append(txt);
para.Append(run);
tc.Append(para);
tr.Append(tc);
下面是结果 table 的示例。如您所见,中间一排比其他排高。在显示 "txt" 的单元格中,字体大小为 9,但在空白单元格中,字体大小为 11。上面的代码用于所有单元格,其中空单元格仅包含文本“”。当我使用打开 XML 工具查看文件时,我可以看到值为 18 的 RunProperties 存在于所有单元格中,包括空单元格。
如何在不显示任何文本的情况下设置单元格的字体大小?
我确认你报告的内容。一种解决方法是用 space " "
替换 "empty" 字符串,当然,将 "space preserve" 添加到文本 运行。
另一种可能性是创建字符样式并将其应用于 table 单元格。事实证明这比听起来更棘手,因为样式需要应用 两次 到包含文本的单元格:一次应用到 ParagraphMark运行Properties,一次应用到 运行属性。对于空单元格,只需将样式应用于 ParagraphMark运行Properties。
实际上,经过反思,您可以对字体大小使用相同的方法...
我在下面的代码中包含了这两种方法。仅用于字体大小的注释被注释掉(四行)。
示例代码假定单行四列的第三个单元格table没有内容。 运行 有内容才添加Text信息
private void btnCreateTable_Click(object sender, EventArgs e)
{
string filePath = @"C:\X\TestCreateTAble.docx";
using (WordprocessingDocument pkg = WordprocessingDocument.Open(filePath, true))
{
MainDocumentPart partDoc = pkg.MainDocumentPart;
Document doc = partDoc.Document;
StyleDefinitionsPart stylDefPart = partDoc.StyleDefinitionsPart;
Styles styls = stylDefPart.Styles;
Style styl = CreateTableCharacterStyle();
stylDefPart.Styles.AppendChild(styl);
Table t = new Table();
TableRow tr = new TableRow();
for (int i = 1; i <= 4; i++)
{
TableCell tc = new TableCell(new TableCellProperties(new TableCellWidth() { Type = TableWidthUnitValues.Dxa, Width = "500" }));
Paragraph para = new Paragraph();
ParagraphProperties paraProps = new ParagraphProperties();
ParagraphMarkRunProperties paraRunProps = new ParagraphMarkRunProperties();
RunStyle runStyl = new RunStyle() { Val = "Table9Point" };
paraRunProps.Append(runStyl);
// FontSize runFont = new FontSize() {Val = "18" };
// paraRunProps.Append(runFont);
paraProps.Append(paraRunProps);
para.Append(paraProps);
Run run = new Run();
Text txt = null;
if (i == 3)
{
}
else
{
txt = new Text("txt");
txt.Space = SpaceProcessingModeValues.Preserve;
RunProperties runProps = new RunProperties();
RunStyle inRunStyl = (RunStyle) runStyl.Clone();
runProps.Append(inRunStyl);
// FontSize inRunFont = (FontSize) runFont.Clone();
// runProps.Append(inRunFont);
run.Append(runProps);
run.Append(txt);
para.Append(run);
}
tc.Append(para);
tr.Append(tc);
}
t.Append(tr);
//Insert at end of document
SectionProperties sectProps = doc.Body.Elements<SectionProperties>().LastOrDefault();
doc.Body.InsertBefore(t, sectProps);
}
}
private Style CreateTableCharacterStyle()
{
Style styl = new Style()
{
CustomStyle = true,
StyleId = "Table9Point",
Type = StyleValues.Character,
};
StyleName stylName = new StyleName() { Val = "Table9Point" };
styl.AppendChild(stylName);
StyleRunProperties stylRunProps = new StyleRunProperties();
stylRunProps.FontSize = new FontSize() { Val = "18" };
styl.AppendChild(stylRunProps);
BasedOn basedOn1 = new BasedOn() { Val = "DefaultParagraphFont" };
styl.AppendChild(basedOn1);
return styl;
}
只需要为ParagraphProperties和RunProperties设置FontSize和FontSizeComplexScript,像这样:
var cell = new TableCell(
new Paragraph(
new ParagraphProperties(
new SpacingBetweenLines { LineRule = LineSpacingRuleValues.Auto, Before = "0", After = "0" },
new RunProperties(
new FontSize { Val = "18" },
new FontSizeComplexScript { Val = "18" })),
new Run(
new RunProperties(
new FontSize { Val = "18" },
new FontSizeComplexScript { Val = "18" }),
new Text { Text = String.Empty, Space = SpaceProcessingModeValues.Preserve })));
我正在使用 C# 在 Word 文件中使用 OpenXml 创建一个 table。我使用
这是我的示例代码,单行单单元格,字体大小应为 9:
TableRow tr = new TableRow();
TableCell tc = new TableCell();
Paragraph par = new Paragraph();
Run run = new Run();
Text txt = new Text("txt");
RunProperties runProps = new RunProperties();
FontSize fontSize = new Fontsize() { Val = "18" }; // font size 9
runProps.Append(fontSize);
run.Append(runProps);
run.Append(txt);
para.Append(run);
tc.Append(para);
tr.Append(tc);
下面是结果 table 的示例。如您所见,中间一排比其他排高。在显示 "txt" 的单元格中,字体大小为 9,但在空白单元格中,字体大小为 11。上面的代码用于所有单元格,其中空单元格仅包含文本“”。当我使用打开 XML 工具查看文件时,我可以看到值为 18 的 RunProperties 存在于所有单元格中,包括空单元格。
如何在不显示任何文本的情况下设置单元格的字体大小?
我确认你报告的内容。一种解决方法是用 space " "
替换 "empty" 字符串,当然,将 "space preserve" 添加到文本 运行。
另一种可能性是创建字符样式并将其应用于 table 单元格。事实证明这比听起来更棘手,因为样式需要应用 两次 到包含文本的单元格:一次应用到 ParagraphMark运行Properties,一次应用到 运行属性。对于空单元格,只需将样式应用于 ParagraphMark运行Properties。
实际上,经过反思,您可以对字体大小使用相同的方法...
我在下面的代码中包含了这两种方法。仅用于字体大小的注释被注释掉(四行)。
示例代码假定单行四列的第三个单元格table没有内容。 运行 有内容才添加Text信息
private void btnCreateTable_Click(object sender, EventArgs e)
{
string filePath = @"C:\X\TestCreateTAble.docx";
using (WordprocessingDocument pkg = WordprocessingDocument.Open(filePath, true))
{
MainDocumentPart partDoc = pkg.MainDocumentPart;
Document doc = partDoc.Document;
StyleDefinitionsPart stylDefPart = partDoc.StyleDefinitionsPart;
Styles styls = stylDefPart.Styles;
Style styl = CreateTableCharacterStyle();
stylDefPart.Styles.AppendChild(styl);
Table t = new Table();
TableRow tr = new TableRow();
for (int i = 1; i <= 4; i++)
{
TableCell tc = new TableCell(new TableCellProperties(new TableCellWidth() { Type = TableWidthUnitValues.Dxa, Width = "500" }));
Paragraph para = new Paragraph();
ParagraphProperties paraProps = new ParagraphProperties();
ParagraphMarkRunProperties paraRunProps = new ParagraphMarkRunProperties();
RunStyle runStyl = new RunStyle() { Val = "Table9Point" };
paraRunProps.Append(runStyl);
// FontSize runFont = new FontSize() {Val = "18" };
// paraRunProps.Append(runFont);
paraProps.Append(paraRunProps);
para.Append(paraProps);
Run run = new Run();
Text txt = null;
if (i == 3)
{
}
else
{
txt = new Text("txt");
txt.Space = SpaceProcessingModeValues.Preserve;
RunProperties runProps = new RunProperties();
RunStyle inRunStyl = (RunStyle) runStyl.Clone();
runProps.Append(inRunStyl);
// FontSize inRunFont = (FontSize) runFont.Clone();
// runProps.Append(inRunFont);
run.Append(runProps);
run.Append(txt);
para.Append(run);
}
tc.Append(para);
tr.Append(tc);
}
t.Append(tr);
//Insert at end of document
SectionProperties sectProps = doc.Body.Elements<SectionProperties>().LastOrDefault();
doc.Body.InsertBefore(t, sectProps);
}
}
private Style CreateTableCharacterStyle()
{
Style styl = new Style()
{
CustomStyle = true,
StyleId = "Table9Point",
Type = StyleValues.Character,
};
StyleName stylName = new StyleName() { Val = "Table9Point" };
styl.AppendChild(stylName);
StyleRunProperties stylRunProps = new StyleRunProperties();
stylRunProps.FontSize = new FontSize() { Val = "18" };
styl.AppendChild(stylRunProps);
BasedOn basedOn1 = new BasedOn() { Val = "DefaultParagraphFont" };
styl.AppendChild(basedOn1);
return styl;
}
只需要为ParagraphProperties和RunProperties设置FontSize和FontSizeComplexScript,像这样:
var cell = new TableCell(
new Paragraph(
new ParagraphProperties(
new SpacingBetweenLines { LineRule = LineSpacingRuleValues.Auto, Before = "0", After = "0" },
new RunProperties(
new FontSize { Val = "18" },
new FontSizeComplexScript { Val = "18" })),
new Run(
new RunProperties(
new FontSize { Val = "18" },
new FontSizeComplexScript { Val = "18" }),
new Text { Text = String.Empty, Space = SpaceProcessingModeValues.Preserve })));