How to get NPOI Excel RichStringCellValue?

时间:2018-10-02 09:07:44

标签: asp.net-core npoi

I am using DotNetCore.NPOI (1.2.1) in order to read an MS Excel file.

Some of the cells are of type text and contain formatted strings (e.g. some words in bold).

How do I get the formatted cell value? My final goal: Retrieve the cell text as HTML.

I tried

var cell = row.GetCell(1);
var richStringCellValue = cell.RichStringCellValue;

But this won't let me access the formatted string (just the plain string without formattings).

Does anybody have an idea or solution?

2 个答案:

答案 0 :(得分:3)

在这种情况下,我认为您必须走更长的路线。首先,您必须维护单元格值的格式,例如日期,货币等,然后从单元格值中提取样式并将该单元格值嵌入该样式下。

最好的选择是编写扩展方法以获取格式和样式值。

要获取fomat,请参阅此链接How to get the value of cell containing a date and keep the original formatting using NPOI

对于样式,首先必须检查并找到运行文本的确切样式,然后在html标记内返回值,下面的方法将使您能够从单元格值中提取样式。代码未经测试,您可能必须包括缺少的库。

 public void GetStyleOfCellValue()
        {

            XSSFWorkbook wb = new XSSFWorkbook("YourFile.xlsx");
            ISheet sheet = wb.GetSheetAt(0);
            ICell cell = sheet.GetRow(0).GetCell(0);  
            XSSFRichTextString richText = (XSSFRichTextString)cell.RichStringCellValue;
            int formattingRuns = cell.RichStringCellValue.NumFormattingRuns;

            for (int i = 0; i < formattingRuns; i++)
            {
                int startIdx = richText.GetIndexOfFormattingRun(i);
                int length = richText.GetLengthOfFormattingRun(i);
                Console.WriteLine("Text: " + richText.String.Substring(startIdx, startIdx + length));
                if (i == 0)
                {
                    short fontIndex = cell.CellStyle.FontIndex;
                    IFont font = wb.GetFontAt(fontIndex);
                    Console.WriteLine("Bold: " + (font.IsBold)); // return string <b>my string</b>.
                    Console.WriteLine("Italics: " + font.IsItalic + "\n"); // return string <i>my string</i>. 
                    Console.WriteLine("UnderLine: " + font.Underline + "\n"); // return string <u>my string</u>. 
                }
                else
                {
                    IFont fontFormat = richText.GetFontOfFormattingRun(i);
                    Console.WriteLine("Bold: " + (fontFormat.IsBold)); // return string <b>my string</b>.
                    Console.WriteLine("Italics: " + fontFormat.IsItalic + "\n");// return string <i>my string</i>. 
                }
            }
        }

答案 1 :(得分:1)

XLSX文件中的字体格式根据模式http://schemas.openxmlformats.org/spreadsheetml/2006/main存储,该模式与HTML标签没有直接关系。因此,您的任务不是那么简单。

style = cell.getCellStyle();
font = style.getFont(); // or style.getFont(workBook);
// use Font object to query font attributes. E.g. font.IsItalic

然后,您将必须通过添加相关的HTML标签来构建HTML。