0

我创建了一张表,我可以使用 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>();

任何人都可以帮助我吗?

4

1 回答 1

2

您删除保护的代码是正确的。但在此之前,您必须在编辑模式下打开 Excel 文件。in 中的第二个参数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();
        }
    }
}
于 2013-05-23T14:09:16.360 回答