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

时间:2014-10-20 12:59:27

标签: 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

它使用下面的代码

创建一些文本和数值
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();

1 个答案:

答案 0 :(得分:4)

默认情况下,MS EXCEL会使用String保存SharedStringTablePart值。这就是为什么当您使用MS EXCEL打开并保存文件时,您的代码似乎正常工作。

但是在这里,当您创建文件时,您将Cell.Datatype定义为CellValues.String(而不是CellValues.SharedString

c6.DataType = CellValues.String;

Cell.DatatypeCellValues.String时,您必须通过阅读 Cell.CellValue 属性来阅读该值。


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