我正在使用几个标签创建和excel文件。我创建一个StreamWriter对象并将excel XML附加到文件中,一切正常。
但是我遇到的问题是我需要在开始时输入摘要标签。为了计算摘要,我需要完成其他选项卡并计算出记录,行和一些统计信息,并将其放在摘要选项卡上。
问题是,我是否无法使用Stream Writer附加到文件的开头。我确实放了一个像标签一样的占位符。关闭文件并再次打开..使用ReadAllText并替换标签...然后写回磁盘。好的小文件,但我通过网络这样做,文件很大,所以它看起来像一个双重写,当它发生,并需要永远..两倍的时间。
有没有更好的方法来做到这一点。我应该使用内存缓冲区吗?我再也不想占用服务器资源了。速度在这里很重要,开放和关闭以及阅读都不是有效的。
添加了一些代码......
直接代码......
//Open a temp File and use Stream Writer..
TempFileName = Path.GetTempFileName();
using (_reportWriter = new StreamWriter(TempFileName, true, Encoding.ASCII, 2048))
{
WriteExcelXmlOpeningTags();
WriteAllDataToFile();
WriteWorksheetXmlClosingTags();
}
//Generate the Summary
String summary = GenerateReportSummary();
//Now I have to open the file, read all the bytes.. replace the tag with the summary and write all the data again...
..此proc在xml中写入开始标记,在末尾写入REPORTSUMMARYSHEET TagHolder。
public void WriteExcelXmlOpeningTags()
{
_reportWriter.WriteLine("<?xml version=\"1.0\"?>");
_reportWriter.WriteLine("<?mso-application Excel.Sheet?>");
_reportWriter.WriteLine("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">");
_reportWriter.WriteLine("<ss:Styles>");
_reportWriter.WriteLine("<ss:Style ss:ID=\"StdHeaderStyle\">");
_reportWriter.WriteLine("<ss:Font ss:Bold=\"1\"/>");
_reportWriter.WriteLine("</ss:Style>");
_reportWriter.WriteLine("<ss:Style ss:ID=\"StdRowStyle\">");
_reportWriter.WriteLine("<Alignment ss:Vertical=\"Top\" ss:WrapText=\"1\"/>");
_reportWriter.WriteLine("</ss:Style>");
_reportWriter.WriteLine("</ss:Styles>");
// This will be replaced with Report Summary Stats at the end of
_reportWriter.WriteLine("<REPORTSUMMARYSHEET_TAGHOLDER>");
_reportWriter.Flush();
}
public void WriteWorksheetXmlClosingTags(int cols)
{
_reportWriter.WriteLine("</Table>");
_reportWriter.WriteLine("<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">" +
"<PageSetup>" +
"<Header x:Margin=\"0.3\"/>" +
"<Footer x:Margin=\"0.3\"/>" +
"<PageMargins x:Bottom=\"0.75\" x:Left=\"0.7\" x:Right=\"0.7\" x:Top=\"0.75\"/>" +
"</PageSetup>" +
"<Selected/>" +
"<FreezePanes/>" +
"<FrozenNoSplit/>" +
"<SplitHorizontal>1</SplitHorizontal>" +
"<TopRowBottomPane>1</TopRowBottomPane>" +
"<ActivePane>2</ActivePane>" +
"<Panes>" +
"<Pane>" +
"<Number>3</Number>" +
"</Pane>" +
"<Pane>" +
"<Number>2</Number>" +
"</Pane>" +
"</Panes>" +
"<ProtectObjects>False</ProtectObjects>" +
"<ProtectScenarios>False</ProtectScenarios>" +
"</WorksheetOptions>" +
"<AutoFilter x:Range=\"R1C1:R1C" + cols.ToString() +
"\" xmlns=\"urn:schemas-microsoft-com:office:excel\">" +
"</AutoFilter>");
_reportWriter.WriteLine("</Worksheet>");
_reportWriter.Flush();
}
然后我必须关闭文件..并使用FileReadAlltext打开它并替换标记。这就像双重努力一样,因为我需要花费相同的时间来编写所有字节,并填充短的summery标记。
尊重M