附加到文件的开头。使用MemoryBuffer或Stream writer和ReadAll Text

时间:2014-09-15 10:48:22

标签: c# excel visual-studio

我正在使用几个标签创建和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

0 个答案:

没有答案