读取创建的excel(打开xml)时共享字符串表返回null

alt*_*gan 2 c# openxml openxml-sdk

我正在使用 open xml sdk 创建 excel 文件。我想使用 open xml 阅读它。当我想阅读它时,我在这一行出错
SharedStringTablePart sstpart = workbookPart.GetPartsOfType<SharedStringTablePart>().First();it return null

如果我打开excel文件并再次保存。它会创建共享字符串表并运行。

从excel读取

#region OpenFile
        public void  OpenFile(string directory)
        {
            try
            {
                fs = new FileStream(directory, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                doc = SpreadsheetDocument.Open(fs, false);
            }
            catch (FileNotFoundException ex)
            {
                string exception = string.Format("Doya bulunamad?{0}", directory); 
                throw new ApplicationException(exception);
            }
        }
        #endregion

        #region GetWorkSheet
        public void AssignWorkSheet(int sheetID)
        {
            if (fs == null || doc == null)
                throw new ApplicationException("Dosya aç?lamad?");

            WorkbookPart workbookPart = doc.WorkbookPart;
            SharedStringTablePart sstpart = workbookPart.GetPartsOfType<SharedStringTablePart>().First();
            sst = sstpart.SharedStringTable;

            var workbook = workbookPart.Workbook;
            var sheets = workbook.Descendants<Sheet>();
            var sheetINVOICE = sheets.ElementAt(sheetID);
            var worksheetPartINVOICE = (WorksheetPart)workbookPart.GetPartById(sheetINVOICE.Id);
            WorkSheet = worksheetPartINVOICE.Worksheet;
            //return sheetInvoice;
        }
        #endregion
Run Code Online (Sandbox Code Playgroud)

它使用以下代码创建了一些文本和数值

var fileName = string.Format(@"C:\Sonuc\{0}\{1}.xlsx", systemType.ToString(), systemTypeEnum.ToString() + "_" + fileType.ToString());
            SpreadsheetDocument xl = SpreadsheetDocument.Create(fileName, SpreadsheetDocumentType.Workbook);
            WorkbookPart wbp = xl.AddWorkbookPart();

            WorksheetPart wsp = wbp.AddNewPart<WorksheetPart>();
            Workbook wb = new Workbook();

            FileVersion fv = new FileVersion();
            fv.ApplicationName = "Microsoft Office Excel";
            Worksheet ws = new Worksheet();

            SheetData sd = new SheetData();

            //int rowCount = 1;
            DocumentFormat.OpenXml.UInt32Value rowCount = 1;



            foreach (var item in resultList)
            {
                rowCount = rowCount + 1;
                Row r3 = new Row() { RowIndex = rowCount };
                Cell c6 = new Cell();
                c6.DataType = CellValues.String;
                c6.CellValue = new CellValue(item.BusinessPartner);
                r3.Append(c6);

                Cell c7 = new Cell();
                c7.DataType = CellValues.Number;
                c7.CellValue = new CellValue(item.VKN);
                r3.Append(c7);

                Cell c8 = new Cell();
                c8.DataType = CellValues.Number;
                c8.CellValue = new CellValue(item.InvoiceCount.ToString());
                r3.Append(c8);

                Cell c9 = new Cell();
                c9.DataType = CellValues.Number;
                c9.CellValue = new CellValue(item.TaxTotalAmount.ToString());
                r3.Append(c9);
                sd.Append(r3);

            }

            ws.Append(sd);
            wsp.Worksheet = ws;
            wsp.Worksheet.Save();

            Sheets sheets = new Sheets();
            Sheet sheet = new Sheet();
            sheet.Name = "Sheet1";
            sheet.SheetId = 1;
            sheet.Id = wbp.GetIdOfPart(wsp);
            sheets.Append(sheet);
            wb.Append(fv);
            wb.Append(sheets);

            xl.WorkbookPart.Workbook = wb;
            xl.WorkbookPart.Workbook.Save();
            xl.Close();
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 8

默认情况下,MS EXCELString使用SharedStringTablePart. 这就是为什么当您使用 MS EXCEL 打开和保存文件时您的代码似乎可以工作的原因。

但是在这里,当您创建文件时,您定义了Cell.Datatypeto CellValues.String(而不是CellValues.SharedString)

c6.DataType = CellValues.String;
Run Code Online (Sandbox Code Playgroud)

当Cell.Datatypeis 时CellValues.String,必须通过读取Cell.CellValue属性来读取值。


要使用 保存String值SharedStringPart,请参阅在线文档: