如何创建可编辑的 excel

How to create an editable excel

我正在创建一个 Excel 文件:

SpreadsheetDocument document = SpreadsheetDocument.Create(filename, SpreadsheetDocumentType.Workbook)
WorkbookPart workBookPart = document.AddWorkbookPart();
            workBookPart.Workbook = new Workbook();

            WorksheetPart workSheetPart = workBookPart.AddNewPart<WorksheetPart>();
            workSheetPart.Worksheet = new Worksheet();


            Sheets sheets = workBookPart.Workbook.AppendChild(new Sheets());

            Sheet sheet = new Sheet()
            {
                Id = workBookPart.GetIdOfPart(workSheetPart),
                SheetId = 1,
                Name = "Test Sheet"
            };
            sheets.Append(sheet);

            workBookPart.Workbook.Save();

当我打开文件时它只是只读的,我如何才能使它对用户可编辑?

ClosedXML优先,替代解决方案可以是OpenXML

您在此处提供的代码创建了一个无效文件,而不是只读文件。有2个小问题。首先,文档中必须只有一个 SheetData element under each Worksheet and secondly you need to call the Close 方法(直接或间接通过 using 语句)。

以下代码将为您创建一个可通过显式调用 Close

进行编辑的文件
SpreadsheetDocument document = SpreadsheetDocument.Create(filename, SpreadsheetDocumentType.Workbook);
WorkbookPart workBookPart = document.AddWorkbookPart();
workBookPart.Workbook = new Workbook();

WorksheetPart workSheetPart = workBookPart.AddNewPart<WorksheetPart>();
workSheetPart.Worksheet = new Worksheet();

//a worksheet *must* have exactly one child SheetData
workSheetPart.Worksheet.AppendChild(new SheetData());

Sheets sheets = workBookPart.Workbook.AppendChild(new Sheets());

Sheet sheet = new Sheet()
{
    Id = workBookPart.GetIdOfPart(workSheetPart),
    SheetId = 1,
    Name = "Test Sheet"
};
sheets.Append(sheet);

workBookPart.Workbook.Save();

//the document must be closed (and ideally disposed)
document.Close();
document.Dispose();

下面是相同的,但使用了 using 语句:

using (SpreadsheetDocument document = SpreadsheetDocument.Create(filename, SpreadsheetDocumentType.Workbook))
{
    WorkbookPart workBookPart = document.AddWorkbookPart();
    workBookPart.Workbook = new Workbook();

    WorksheetPart workSheetPart = workBookPart.AddNewPart<WorksheetPart>();
    workSheetPart.Worksheet = new Worksheet();

    //a worksheet *must* have exactly one child SheetData
    workSheetPart.Worksheet.AppendChild(new SheetData());

    Sheets sheets = workBookPart.Workbook.AppendChild(new Sheets());

    Sheet sheet = new Sheet()
    {
        Id = workBookPart.GetIdOfPart(workSheetPart),
        SheetId = 1,
        Name = "Test Sheet"
    };
    sheets.Append(sheet);

    workBookPart.Workbook.Save();
}

编辑

在 ClosedXml 中执行此操作要简单得多。以下将生成等效的工作簿:

using ClosedXML.Excel;
....

var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Test Sheet");
workbook.SaveAs(filename);