openxml 2.5,如何将字符串插入单元格?

时间:2014-02-07 20:53:01

标签: c# string excel insert openxml

我已经尝试了几天将字符串插入openxml电子表格。其他所有事情(到目前为止)都有效,除此之外的一切。

这是我目前正在运行的代码(注意,这纯粹是出于测试目的并且非常基本):

using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Create(file + "test.zip", SpreadsheetDocumentType.Workbook))
{
   spreadSheet.AddWorkbookPart();
   spreadSheet.WorkbookPart.Workbook = new Workbook();

   spreadSheet.WorkbookPart.AddNewPart<SharedStringTablePart>();
   spreadSheet.WorkbookPart.SharedStringTablePart.SharedStringTable = new SharedStringTable() {Count=1, UniqueCount=1};

   spreadSheet.WorkbookPart.SharedStringTablePart.SharedStringTable.AppendChild(new SharedStringItem(new Text("test")));                
   spreadSheet.WorkbookPart.SharedStringTablePart.SharedStringTable.Save();

   preadSheet.WorkbookPart.AddNewPart<WorksheetPart>();
   spreadSheet.WorkbookPart.WorksheetParts.First().Worksheet = new Worksheet();                

   spreadSheet.WorkbookPart.WorksheetParts.First().Worksheet.AppendChild(new SheetData());
   spreadSheet.WorkbookPart.WorksheetParts.First().Worksheet.First().AppendChild(new Row());

   Row r2 = new Row() { RowIndex = 5 };
   spreadSheet.WorkbookPart.WorksheetParts.First().Worksheet.First().AppendChild(r2);

   r2.AppendChild(new Cell() { CellReference = "A5", CellValue = new CellValue("0"), DataType = new EnumValue<CellValues>(CellValues.SharedString) });

   spreadSheet.WorkbookPart.WorksheetParts.First().Worksheet.Save();

   spreadSheet.WorkbookPart.Workbook.GetFirstChild<Sheets>().AppendChild(new Sheet()
            {
                Id = spreadSheet.WorkbookPart.GetIdOfPart(spreadSheet.WorkbookPart.WorksheetParts.First()),
                SheetId = 1,
                Name = "test"
            });

            spreadSheet.WorkbookPart.Workbook.Save();  
        }

一切似乎都有效,文件保存在我想要的地方,并且通常看起来像我期望的那样。 “唯一”的问题是,当我将字符串添加到单元格时,excel会给我一个错误,说明该文件已损坏并继续删除所述单元格。

我做错了吗?

2 个答案:

答案 0 :(得分:1)

在你的方法中尝试这个..

 if (spreadSheet.WorkbookPart.GetPartsOfType<SharedStringTablePart>().Count() > 0)
                    {
                    shareStringPart = spreadSheet.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First();
                    }
                else
                    {
                    shareStringPart = spreadSheet.WorkbookPart.AddNewPart<SharedStringTablePart>();
                    }
index = InsertSharedStringItem(cell_value, shareStringPart);
cell.CellValue = new CellValue(index.ToString());
cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);

InsertSharedString方法:

 private static int InsertSharedStringItem(string text, SharedStringTablePart shareStringPart)
                {
                // If the part does not contain a SharedStringTable, create one.
                if (shareStringPart.SharedStringTable == null)
                    {
                    shareStringPart.SharedStringTable = new SharedStringTable();
                    }

            int i = 0;

            // Iterate through all the items in the SharedStringTable. If the text already exists, return its index.
            foreach (SharedStringItem item in shareStringPart.SharedStringTable.Elements<SharedStringItem>())
                {
                if (item.InnerText == text)
                    {
                    return i;
                    }

                i++;
                }

            // The text does not exist in the part. Create the SharedStringItem and return its index.
            shareStringPart.SharedStringTable.AppendChild(new SharedStringItem(new DocumentFormat.OpenXml.Spreadsheet.Text(text)));
            shareStringPart.SharedStringTable.Save();

            return i;
            }

答案 1 :(得分:0)

我认为您应该创建一个电子表格(使用Excel),将文本添加到单元格中,然后在“OpenXML 2.5 Productivity Tool”中打开此电子表格。生产力工具中有一个“反映代码”按钮,可帮助您在代码中复制需要执行的操作。这是最简单的方法,我发现可以解决这些问题。