【问题标题】:How to make Excel wrap text in formula cell with ClosedXml如何使用 ClosedXml 使 Excel 在公式单元格中换行
【发布时间】:2013-02-18 08:34:37
【问题描述】:

问题是单元格内容没有被包装,当该单元格包含一个引用具有一些长字符串的单元格的公式时。

CodePlex我找到了一个关于这个问题的线程和一个简单的代码来查看问题:

var generated = new XLWorkbook();
var workSheet = generated.AddWorksheet("Test");
workSheet.Cell("B1").Style.Alignment.WrapText = true;
workSheet.Cell("B1").Value = "hello hello hello hello hello";
workSheet.Cell("A3").FormulaA1 = "B1";
workSheet.Cell("A3").Style.Alignment.WrapText = true;
generated.SaveAs("Generated.xlsx");

我也尝试手动设置行高而不是包装单元格:

workSheet.Row(3).Height = workSheet.Row(1).Height;

然而也没有成功。

对此我有什么办法吗?


根据 Peter Albert 的评论,我尝试将设置行设为 AutoFit。我设法在 ClosedXML 中找到的唯一方法是 workSheet.Row(3).AdjustToContent();。但这也不起作用(也没有调整某些列的内容)。

【问题讨论】:

  • 试试worksheet.Cell("A3").WrapText = True,然后是worksheet.Row(3).EntireRow.AutoFit
  • @PeterAlbert 我想这值得回答!
  • @PeterAlbert 自己检查过这个吗?此外IXLRow 中没有属性EntireRow....我想你的意思是AdjustToContent ??然而这并没有改变。
  • 我在单元格上尝试了.WrapText = True,它指的是其他带有长文本的单元格,它对我有用(单元格水平长大)。我不明白你的问题...
  • @Kamil 你能否展示一个小的工作程序(就像我的问题一样),生成一个带有公式的单元格的 xlsx,它会根据显示的值改变它的宽度?

标签: c# excel closedxml


【解决方案1】:

找到以下解决方案(仅限excel):

  1. 我为所有使用的单元格设置row.Cells("start cell : end cell").Style.Alignment.SetWrapText(true)

  2. 我用以下文本编写了一个 VBA 宏: Range("A" & Row & ":N" & Row).EntireRow.AutoFit(对于行) Range("A" & Row & ":N" & Row).EntireColumn.AutoFit(列)

  3. 指定它在文档启动时运行

【讨论】:

    【解决方案2】:

    SetWrapText(); 为我工作

    【讨论】:

      【解决方案3】:

      另请注意,在同一个 Codeplex 页面上,库的作者指出:

      这个需要一段时间才能弄清楚。

      当您在指向另一个单元格的单元格上设置换行文本时,Excel 实际上是在作弊。它计算所需的高度,然后设置行高属性。这是我在这里做不到的。

      你将不得不这样做。

      对我来说,这意味着这个功能是不可能的。

      【讨论】:

        【解决方案4】:

        您可以像这样应用 Wraptext,而不是对内容应用调整

        var generated = new XLWorkbook();
        var workSheet = generated.AddWorksheet("Test");
        worksheet.Cell(3, 2).Value = "Hello Hello Hello Hello Hello Hello Name";    
        worksheet.Cell(3, 2).Style.Alignment.WrapText = true;
        

        如果您想同时应用两者,请在 AdjustToContents 之后使用它。

        var generated = new XLWorkbook();
        var workSheet = generated.AddWorksheet("Test");
        worksheet.Columns(2, 20).AdjustToContents();    
        worksheet.Cell(3, 2).Value = "Hello Hello Hello Hello Hello Hello Name";
        worksheet.Cell(3, 2).Style.Alignment.WrapText = true;
        

        【讨论】:

        • 为什么在 AdjustToContents 之后使用 WrapText?
        【解决方案5】:

        我用这个

         xlWorkSheet.Range["A4:A4"].Cells.WrapText = true;
        

        【讨论】:

        • ClosedXML 没有这种类型的 Range 索引器。您是否可能发布了EPPlus 代码?
        • 这个语法似乎在最新版本的 ClosedXml 中发生了变化,因为文本换行更像是一种样式功能。当前语法如下所示(C#):worksheet.FirstCell().Style.Alignment.SetWrapText(true);
        【解决方案6】:

        对不起,我还是不能写 cmets... AutoFit 不是 ClosedXML 的属性。 关于 AdjustToContents,在我的版本(2014 年 7 月 26 日,我认为 0.72.3)中忽略了 WordWrap 属性(分割长行)。 这是主要检查

                    if (c.HasRichText || textRotation != 0 || c.InnerText.Contains(Environment.NewLine))
                    {
                       // omissis...
                    }
                    else
                        thisHeight = c.Style.Font.GetHeight( fontCache);
        

        如果单元格由于自动换行而超过一行,此实现会忽略确切的高度。因此,AdjustToContents + AutoWrap 不起作用。如果你需要有你需要避免调用 AdjustToContents 的内容的高度大小。 此行为与 XL IsAutoHeight 属性不兼容。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多