我正在尝试以XML Spreadsheet 2003格式创建电子表格(因此Excel可以阅读它)。我正在使用XDocument类编写文档,我需要在其中一个<Cell>
标记的主体中添加换行符。 Excel在读取和写入时,要求文件在字符串中嵌入文字字符串
,以正确显示电子表格中的换行符。它也是这样写的。
问题是当我在我的数据中有换行符时,XDocument正在编写CR-LF(\ r \ n),当我尝试对输入字符串执行.Replace()
时,它会自动为我转义&符号,所以我最终在我的文件中使用&#10;
,Excel很乐意将其写成字符串文字。
有没有办法让XDocument写出文字
作为XML流的一部分?我知道我可以通过从XmlTextWriter派生来实现它,或者只是用TextWriter写出文件,但是如果可能的话我不想这样做。
答案 0 :(得分:3)
我想知道直接使用XmlWriter
和WriteRaw
是否更好?
快速检查表明XmlDocument
稍微改善了它,但xml和空白很快就变得棘手......
答案 1 :(得分:2)
我与这个问题斗争了几天,最后提出了这个解决方案。我使用了XMLDocument.Save(Stream)
方法,然后从流中获取了格式化的XML字符串。然后我用&#10;
替换
次出现,并使用TextWriter将字符串写入文件。
string xml = "<?xml version=\"1.0\"?><?mso-application progid='Excel.Sheet'?><Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:html=\"http://www.w3.org/TR/REC-html40\">";
xml += "<Styles><Style ss:ID=\"s1\"><Alignment ss:Vertical=\"Center\" ss:WrapText=\"1\"/></Style></Styles>";
xml += "<Worksheet ss:Name=\"Default\"><Table><Column ss:Index=\"1\" ss:AutoFitWidth=\"0\" ss:Width=\"75\" /><Row><Cell ss:StyleID=\"s1\"><Data ss:Type=\"String\">Hello&#10;&#10;World</Data></Cell></Row></Table></Worksheet></Workbook>";
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.LoadXml(xml); //load the xml string
System.IO.MemoryStream stream = new System.IO.MemoryStream();
doc.Save(stream); //save the xml as a formatted string
stream.Position = 0; //reset the stream position since it will be at the end from the Save method
System.IO.StreamReader reader = new System.IO.StreamReader(stream);
string formattedXML = reader.ReadToEnd(); //fetch the formatted XML into a string
formattedXML = formattedXML.Replace("&#10;", " "); //Replace the unhelpful &#10;'s with the wanted endline entity
System.IO.TextWriter writer = new System.IO.StreamWriter("C:\\Temp\test1.xls");
writer.Write(formattedXML); //write the XML to a file
writer.Close();