【问题标题】:How to create an editable excel如何创建可编辑的excel
【发布时间】:2017-06-28 06:42:17
【问题描述】:

我正在创建一个 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

【问题讨论】:

  • 关闭VS。当 VS 仍然打开时,文件是只读的,因为 VS 应用程序仍然打开它。
  • @jdweng 它已关闭,当我打开文件时它仍然是只读的。

标签: c# excel openxml closedxml


【解决方案1】:

您在此处提供的代码会创建一个无效文件,而不是一个只读文件。有2个小问题。首先,每个Worksheet 下必须有一个SheetData 元素,其次您需要在文档上调用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);

【讨论】:

  • 有没有办法用 closedxml 重现它?您的答案是完美的,但是使用 closedXML 更容易完成 excel 文件所需的功能,但是在使用 closedxml 时我遇到了同样的问题,即该文件是只读的。只是我希望整个项目都使用 closedXML 来完成,而不是与 OpenXML 混合
  • 嗨@Toni,我已经更新了答案以包含一个 ClosedXml 示例。
猜你喜欢
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多