3

在 C# 中,以下程序编译并运行,但它不会在 excel 输出文件中写入任何内容。

我让它在没有的情况下工作,OpenXmlWriter但我开始内存不足,所以我必须OpenXmlWriter根据这个http://blogs.msdn.com/b/brian_jones/archive/2010/06/22/writing-large-excel切换到-files-with-the-open-xml-sdk.aspx

class Program
{
    static void Main(string[] args)
    {
        File.Copy("book.xlsx", "output.xlsx", true);
        WriteValuesSAX("output.xlsx", 10, 10);
    }

    static void WriteValuesSAX(string filename, int numRows, int numCols)
    {
        using (SpreadsheetDocument myDoc = 
               SpreadsheetDocument.Open(filename, true))
        {
            WorkbookPart workbookPart = myDoc.WorkbookPart;
            WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();

            OpenXmlWriter writer = OpenXmlWriter.Create(worksheetPart);

            Row r = new Row();
            Cell c = new Cell();
            CellValue v = new CellValue("Test");
            c.AppendChild(v);

            writer.WriteStartElement(new SheetData());
            for (int row = 0; row < numRows; row++)
            {
                writer.WriteStartElement(r);
                for (int col = 0; col < numCols; col++)
                {
                    writer.WriteElement(c);
                }
                writer.WriteEndElement();
            }
            writer.WriteEndElement();

            writer.Close();
        }
    }
}

为什么它不写任何东西来输出?

4

2 回答 2

4

我还不太了解这一点,但我得到了它的工作。这就是我最终的结果。

class Program
{
    static void Main(string[] args)
    {
        File.Copy("book.xlsx", "output.xlsx", true);
        WriteRandomValuesSAX("output.xlsx", 10, 10);
    }

    static void WriteRandomValuesSAX(string filename, int numRows, int numCols)
    {
        using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open(filename, true))
        {
            WorkbookPart workbookPart = myDoc.WorkbookPart;
            WorksheetPart worksheetPart = workbookPart.WorksheetParts.Last();

            OpenXmlWriter writer = OpenXmlWriter.Create(worksheetPart);

            Row r = new Row();
            Cell c = new Cell();
            CellValue v = new CellValue("Test");
            c.AppendChild(v);

            writer.WriteStartElement(new Worksheet());
            writer.WriteStartElement(new SheetData());
            for (int row = 0; row < numRows; row++)
            {
                writer.WriteStartElement(r);
                for (int col = 0; col < numCols; col++)
                {
                    writer.WriteElement(c);
                }
                writer.WriteEndElement();
            }
            writer.WriteEndElement();
            writer.WriteEndElement();

            writer.Close();
        }
    }
}

注意我添加了writer.WriteStartElement(new Worksheet());另一个writer.WriteEndElement();


我在这里找到了正确的 xml 格式:http: //msdn.microsoft.com/en-us/library/gg278309.aspx

哪个是

<?xml version="1.0" encoding="utf-8"?> <x:worksheet xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <x:sheetData>
        <x:row r="1">
            <x:c r="A1" t="n">
                <x:v>100</x:v>
            </x:c>
        </x:row>
    </x:sheetData> </x:worksheet>

所以我打开(解压缩)xlsx 文件并导航到 output.xlsx\xl\worksheets\sheet1.xml,发现我缺少<x:worksheet>.

于 2012-05-09T18:05:36.070 回答
1

使用上面的代码会在 Excel 2007 中给我错误消息“Excel 发现不可读的内容”。使用此处的信息how-to-properly-use-openxmlwriter-to-write-large-excel-files并在添加列时更改代码到以下删除了错误。

for(int col = 0; col < numCols; col++)
{
    var oxa = new List<OpenXmlAttribute>();
    oxa.Add(new OpenXmlAttribute("t",null,"str"));
    writer.WriteStartElement(c,oxa);
    writer.WriteElement(new CellValue(string.Format("R{0}C{1}", row, col)));
    writer.WriteEndElement();
}
于 2015-04-29T11:44:54.857 回答