I am using LINQ to XML to create an Excel XML file. I want to include newlines within the cells. Excel uses the
literal to represent a new line. If I try to add this using an XText:
XText newlineElement = new XText( "Foo Bar" );
I get:
Foo
Bar
Which shows up in Excel as:
Foo Bar
Is there a way to write 

to the XML file without doing a
String.Replace( "
", " " )
over the resulting file text?
EDIT Here is a code snippet showing how I create a row for the Excel document. I was avoiding it since it is a little messy. :) Let me know if more code would help, or if this just adds more confusion.
In this example, the newlineElement
described above is represented by the only XText in the code sample.
const string CELL = "{urn:schemas-microsoft-com:office:spreadsheet}Cell";
const string DATA = "{urn:schemas-microsoft-com:office:spreadsheet}Data";
const string STYLE = "{urn:schemas-microsoft-com:office:spreadsheet}StyleID";
const string TYPE= "{urn:schemas-microsoft-com:office:spreadsheet}Type";
const string HEIGHT = "{urn:schemas-microsoft-com:office:spreadsheet}Height";
const string ROW = "{urn:schemas-microsoft-com:office:spreadsheet}Row";
...
XElement rowElement = new XElement( Row,
new XElement( CELL,
new XAttribute( STYLE, "s0" ) ),
new XElement( CELL,
new XElement( DATA,
new XText( description.Replace("\n", " ") ),
new XAttribute( TYPE, "String" ) ),
new XAttribute( STYLE, "sWrap" ) ),
new XElement( CELL,
new XAttribute( STYLE, "s0" ) ),
new XAttribute( HEIGHT, height ) );
This produces:
<ss:Row ss:Height="45">
<ss:Cell ss:StyleID="s0" />
<ss:Cell ss:StyleID="sWrap">
<ss:Data ss:Type="String">Foo&#10;Bar</ss:Data>
</ss:Cell>
<ss:Cell ss:StyleID="s0" />
</ss:Row>
Thanks for the help thus far!
Not sure if this helps, but the following code:
var newlineElement = new XText("Foo Bar");
Console.WriteLine(newlineElement);
Console.WriteLine(newlineElement.Value);
Produces this output:
Foo$amp;#10;Bar
Foo Bar
So, in your code that is using the newlineElement
object, could you use the .Value
property?
insert the actual character into the string rather than the escape code - LINQ will handle the conversion for you.
EDIT:
Ok - this was completely wrong, but helped me to get something which (I think) works. If you want to embed something which would otherwise be escaped by the XML rendering, you need to embed it in a CDATA
block. Check out this related question on C# and XML which tripped my memory.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With