如何使用OpenXML代码取消保护工作表?

时间:2013-05-20 05:07:50

标签: openxml

我创建了一个Sheet,我可以使用OpenXml代码保护它。

但是现在需要阅读这个excel文件。

我将所有值都设为NULL,因为它受到保护。

(我还没有在代码中放置任何密码来保护工作表,excel文件中只有一个工作表。)

我的搜索中有以下代码来取消保护工作表。

  workSheet.RemoveAllChildren<SheetProtection>();

但是,这不起作用。我在阅读这张受保护的工作表时仍然获得空值。

 using (SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(FilePath, false))
            {
                WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
                IEnumerable<Sheet> sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
                //if ((sheets.Count() != 2) && (sheets.First().Name.Value != "StudentNomination") && (sheets.Last().Name.Value != "Sheet2"))
                //{
                //    throw new Exception("Please Upload the correct Nomination file, for example you can download the Nomination Template file first.!!");
                //}
                string relationshipId = sheets.First().Id.Value;
                WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId);
                Worksheet workSheet = worksheetPart.Worksheet;
                workSheet.RemoveAllChildren<SheetProtection>();
                SheetData sheetData = workSheet.GetFirstChild<SheetData>();
                IEnumerable<Row> rows = sheetData.Descendants<Row>();

任何人都可以帮我吗?

1 个答案:

答案 0 :(得分:1)

您的删除保护代码是正确的。但在此之前,您必须在编辑模式下打开Excel文件。 SpreadSheetDocument.Open中的第二个参数应设置为true

同样无论保护如何,您都应该能够读取单元格的值。请参阅以下代码。为了测试这个,你必须创建一个excel文件并用数字填充单元格A1,B1和C1。

using System.Linq;
using System.Collections.Generic;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

class Test
{

    static void Main()
    {
        string filePath = @"E:\test.xlsx";
        using (SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(filePath, true))
        {
            WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
            IEnumerable<Sheet> sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
            string relationshipId = sheets.First().Id.Value;
            WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId);
            Worksheet workSheet = worksheetPart.Worksheet;

            var dataBeforeProtection = workSheet.Descendants<Row>().First().Descendants<Cell>().First().CellValue.InnerText;
            workSheet.RemoveAllChildren<SheetProtection>();
            var dataAfterProtection = workSheet.Descendants<Row>().First().Descendants<Cell>().First().CellValue.InnerText;
            workSheet.Save();
        }
    }
}