Open XML SDK:格式化Excel单元格的一部分

时间:2011-08-30 11:03:28

标签: c# excel openxml openxml-sdk

使用带有DocumentFormat.OpenXml.Spreadsheet的Open XML for Excel,如何仅将文本的一部分设置为粗体?

var cell = new Cell {
    //DataType = CellValues.InlineString,
    CellReference = "A" + 1
};

// TODO: Set "bold text" to bold style
//var inlineString = new InlineString();
//inlineString.AppendChild(new Text { Text = "Normal text... bold text..." });
//cell.AppendChild(inlineString);

已注释掉现在使用的代码,但应该或可能应该更改。

1 个答案:

答案 0 :(得分:6)

要仅将文本的一部分设置为粗体,您需要将文本插入SharedStringTable并使单元格的数据类型为SharedString而不是InlineString来控制该文本。这将使CellValue成为此表的引用,如0,1,2等,并允许更多控制,然后执行内联字符串。

以下是一些示例代码,介绍如何制作分析的第二部分“普通文本...粗体文本...”粗体:

       // Creates an SharedStringItem instance and adds its children.
        public SharedStringItem GenerateSharedStringItem()
        {
            SharedStringItem sharedStringItem1 = new SharedStringItem();

            Run run1 = new Run();
            Text text1 = new Text(){ Space = SpaceProcessingModeValues.Preserve };
            text1.Text = "Normal text… ";

            run1.Append(text1);

            Run run2 = new Run();

            RunProperties runProperties1 = new RunProperties();
            Bold bold1 = new Bold();
            FontSize fontSize1 = new FontSize(){ Val = 11D };
            Color color1 = new Color(){ Theme = (UInt32Value)1U };
            RunFont runFont1 = new RunFont(){ Val = "Calibri" };
            FontFamily fontFamily1 = new FontFamily(){ Val = 2 };
            FontScheme fontScheme1 = new FontScheme(){ Val = FontSchemeValues.Minor };

            runProperties1.Append(bold1);
            runProperties1.Append(fontSize1);
            runProperties1.Append(color1);
            runProperties1.Append(runFont1);
            runProperties1.Append(fontFamily1);
            runProperties1.Append(fontScheme1);
            Text text2 = new Text();
            text2.Text = "bold text…";

            run2.Append(runProperties1);
            run2.Append(text2);

            sharedStringItem1.Append(run1);
            sharedStringItem1.Append(run2);
            return sharedStringItem1;
        }

要使用此方法,您需要先找到SharedStringTable的实例,然后将新的ShareStringItem插入其中:

            using (MemoryStream stream = new MemoryStream())
            {
                // create in-memory copy of the Excel template file
                byte[] byteArray = File.ReadAllBytes(TEMPLATE_FILE_NAME);
                stream.Write(byteArray, 0, (int)byteArray.Length);

                using (SpreadsheetDocument document = SpreadsheetDocument.Open(stream, true))
                {
                    // Set private variable template component references (for reuse between methods)
                    mExcelWorkbookPart = document.WorkbookPart;
                    mSharedStringTablePart = mExcelWorkbookPart.SharedStringTablePart;

                    mSharedStringTablePart.SharedStringTable.AppendChild(GenerateSharedStringItem());
                }

                return stream.ToArray();
            }