【问题标题】:Exporting to Excel (OpenXML) results in Unreadable Content导出到 Excel (OpenXML) 会导致内容不可读
【发布时间】:2014-10-09 05:34:58
【问题描述】:

我一直在为我的 xlsx 文件创建工作表而苦苦挣扎。添加第一个工作表不是问题,但是当我想要第二个工作表时,导出的 xlsx 似乎已损坏。谁能指出我做错了什么? 注意:我已经尝试调用 'workbookpart,Workbook.Save();'在创建第一个工作簿之后,但没有所需的结果。

protected void export_Click(object sender, EventArgs e)
{
    ExportToExcel(@"D:\dev\Dotnet4\Excel\test.xlsx");
}

private void ExportToExcel(string filepath)
{
    SpreadsheetDocument spreadsheetDocument;
    WorkbookPart workbookpart;
    CreateSpreadsheet(filepath, out spreadsheetDocument, out workbookpart);

    CreateWorksheet(spreadsheetDocument, workbookpart, "My sheet 1");
    CreateWorksheet(spreadsheetDocument, workbookpart, "My sheet 2");

    workbookpart.Workbook.Save();

    // Close the document.
    spreadsheetDocument.Close();
}

private static void CreateWorksheet(SpreadsheetDocument spreadsheetDocument, WorkbookPart workbookpart, string worksheetName)
{
    // Add a WorksheetPart to the WorkbookPart.
    WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
    worksheetPart.Worksheet = new Worksheet(new SheetData());

    // Add Sheets to the Workbook.
    Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.
        AppendChild<Sheets>(new Sheets());

    // Append a new worksheet and associate it with the workbook.
    Sheet sheet = new Sheet()
    {
        Id = spreadsheetDocument.WorkbookPart.
            GetIdOfPart(worksheetPart),
        SheetId = 1,
        Name = worksheetName
    };
    sheets.Append(sheet);
}

private static void CreateSpreadsheet(string filepath, out SpreadsheetDocument spreadsheetDocument, out WorkbookPart workbookpart)
{
    // Create a spreadsheet document by supplying the filepath.
    // By default, AutoSave = true, Editable = true, and Type = xlsx.
    spreadsheetDocument = SpreadsheetDocument.
        Create(filepath, SpreadsheetDocumentType.Workbook);

    // Add a WorkbookPart to the document.
    workbookpart = spreadsheetDocument.AddWorkbookPart();
    workbookpart.Workbook = new Workbook();
}

【问题讨论】:

    标签: c# excel openxml


    【解决方案1】:

    我认为你有两个小问题:

    1. SheetId 与您添加的两张工作表相同,这是无效的。
    2. 您每次调用CreateWorksheet 时都会添加一个新的Sheets 元素,但XML 中应该只有一个这样的元素(Sheet 有很多但Sheets 不多!)。李>

    要解决 1,您可以使用 sheets.ChildElements 的计数。因为这是0 第一次,第二次你需要添加1 到它。如果您愿意,可以将其作为参数传入CreateWorksheet;只要它们从 1 开始并且不同,这并不重要。

    要解决 2,您可以对 WorkbookSheets 属性执行空检查,并且仅在它不存在时才创建它。

    下面应该做你所追求的。

    private static void CreateWorksheet(SpreadsheetDocument spreadsheetDocument, WorkbookPart workbookpart, string worksheetName)
    {
        // Add a WorksheetPart to the WorkbookPart.
        WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
        worksheetPart.Worksheet = new Worksheet(new SheetData());
    
        // Add Sheets to the Workbook.
        if (spreadsheetDocument.WorkbookPart.Workbook.Sheets == null)
        {
            //spreadsheetDocument.WorkbookPart.Workbook.Sheets = new Sheets();
            spreadsheetDocument.WorkbookPart.Workbook
                                            .AppendChild<Sheets>(new Sheets());
        }
    
        Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.Sheets;
    
        // Append a new worksheet and associate it with the workbook.
        Sheet sheet = new Sheet()
        {
            Id = spreadsheetDocument.WorkbookPart.
                GetIdOfPart(worksheetPart),
            SheetId = (UInt32)sheets.ChildElements.Count + 1,
            Name = worksheetName
        };
        sheets.Append(sheet);
    }
    

    最后一点是SpreadsheetDocument 实现了IDisposable,所以它应该在使用后被丢弃。

    【讨论】:

    • 感谢您的回答。你的第一条笔记我也在发布后不久发现了。您提到的第二个问题似乎确实是问题所在。修复后,这就像一个魅力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    相关资源
    最近更新 更多