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

7

使用 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个回答

8
要只将部分文本设置为粗体,您需要通过将文本插入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();
            }

嗨amurra,你能帮我解决https://dev59.com/o2Uo5IYBdhLWcg3wvRpF这个问题吗?不确定如何让单元格有边框。谢谢。 - Nate Pet
InlineString 可能也有两个运行,参见 https://dev59.com/NVkS5IYBdhLWcg3wcGaW#39853844。 - xmedeko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接