如何用C#在Excel单元格中编程插入新行?

27

我正在使用Aspose库创建Excel文档。在文本的两个部分之间,我需要在某个单元格中插入一个新行。

我尝试了"\r\n",但它不起作用,在单元格中只显示两个方块符号。但是,我可以按Alt+Enter在同一单元格中创建新行。

如何以编程方式插入新行?


你是否使用了正确的编码方式?.NET字符串是UTF16编码... - Mitch Wheat
我真的没有什么主意。我只是修改别人的代码。有没有办法以不同的方式编码一个字符串? - User
13个回答

33

收到了这个异常:'System.__ComObject'不包含名为'IsTextWrapped'的定义。 - hakan
1
尝试使用“worksheet.Cells[0, 0].Style.WrapText = true;”代替。 - JCO9

10
cell.Text = "your firstline<br style=\"mso-data-placement:same-cell;\">your secondline";

如果您从数据库中获取文本,则:

cell.Text = textfromDB.Replace("\n", "<br style=\"mso-data-placement:same-cell;\">");

5
你需要插入Excel使用的字符代码,我记得是10(十)。

编辑: 好的,这里有一些代码。请注意,通过创建一个包含以下内容的单元格,我能够确认使用的字符代码确实是10:

A

B

然后选择它并在VBA立即窗口中执行以下操作:

?Asc(Mid(Activecell.Value,2,1))

因此,在VBA中将该值插入到另一单元格中所需的代码如下:
ActiveCell.Value = "A" & vbLf & "B"

(由于vbLf是字符代码10),所以在字符串中使用时需要注意。

我知道你正在使用C#,但我发现如果你先在VBA中试着做一遍,就能更容易弄清楚该怎么做,因为你可以在不编译任何东西的情况下“交互式”地尝试它。无论你在C#中做什么,都只是在复制你在VBA中所做的,所以很少有差别。(请记住,C#互操作性的东西只是使用与VBA相同的基础COM库)。

无论如何,这个问题的C#代码应该是:

oCell.Value = "A\nB";

寻找差异 :-)


编辑2: 噢呜!我刚才重新阅读了帖子,看到你正在使用Aspose库。抱歉,在这种情况下我不知道该怎么办。


1
U+000A 是 \n。但我认为如果那样可以的话,插入 \r\n 也应该可以,但是会在第一个单元格上留下一个方块。 - Joey
我从未接触过也没有见过VBA,所以无论如何我都做不了。无论如何,感谢您的时间。 - User
最终我选择了分号,因为换行是可选项而不是必需品。因此问题已经解决。 - User

4

在内部,Excel 使用 U+000D U+000A (CR+LF, \r\n) 作为换行符,至少在其 XML 表示中如此。我也没有在单元格中直接找到这个值。它被迁移到另一个包含共享字符串的 XML 文件中。可能包含换行符的单元格在文件格式上有不同的处理方式,你的库可能不知道这一点。


似乎在Excel 2010中CRLF可以正常工作,但在早期版本中会导致显示不可打印字符框。为了与早期版本的Excel兼容,只使用"\n"(LF)是必需的。 - Adam Glauser

3

如果有人对Infragistics解决方案感兴趣,这里有相关信息。

  1. 使用

    Environment.NewLine

  2. 确保单元格换行

    dataSheet.Rows[i].Cells[j].CellFormat.WrapText = ExcelDefaultableBoolean.True;


ExcelDefaultableBoolean.True 没有这种东西。 - hakan
@hakan:我没有问题找到和使用ExcelDefaultableBoolean.True,也许这是与Infragistics的版本有关?这不会是他们第一次更改某些内容。 - Auction God

1

.NET的SpreadsheetGear是这样做的:

        IWorkbook workbook = Factory.GetWorkbook();
        IRange a1 = workbook.Worksheets[0].Cells["A1"];
        a1.Value = "Hello\r\nWorld!";
        a1.WrapText = true;
        workbook.SaveAs(@"c:\HelloWorld.xlsx", FileFormat.OpenXMLWorkbook);

请注意 "WrapText = true" - 如果没有这个设置,Excel 将不会自动换行。我想 Aspose 也有类似的 API。
免责声明:我拥有 SpreadsheetGear LLC。

0
E.Run runForBreak = new E.Run();

E.Text textForBreak = new E.Text() { Space = SpaceProcessingModeValues.Preserve };
textForBreak.Text = "\n";
runForBreak.Append(textForBreak);
sharedStringItem.Append(runForBreak);

2
虽然提供仅包含代码的答案是可以接受的,但如果您能够提供代码解释并帮助人们理解为什么它解决了问题,那对社区来说通常更有用。这可以减少后续问题的数量,并帮助新开发人员理解基本概念。在这里尤其有用,因为已经有其他十二个答案了;那么您的方法与它们有何不同呢?我可以请求您更新您的问题并提供更多细节吗? - Jeremy Caney

0
使用 PEAR 的 'Spreadsheet_Excel_Writer' 和 'OLE':
我能让 "\n" 正常工作的唯一方法是将单元格设置为 $format->setTextWrap();,然后使用 "\n"。

0

您可以使用Chr(13)。然后将整个内容用Chr(34)包裹起来。Chr(34)代表双引号。

  • VB.Net示例:
  • TheContactInfo = ""
  • TheContactInfo = Trim(TheEmail) & chr(13)
  • TheContactInfo = TheContactInfo & Trim(ThePhone) & chr(13)
  • TheContactInfo = Chr(34) & TheContactInfo & Chr(34)

0

"\n"很好用。如果输入来自多行文本框,换行符将是"\r\n",如果将其替换为"\n",它将正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接