如何获取 NPOI Excel RichStringCellValue?
How to get NPOI Excel RichStringCellValue?
我正在使用 DotNetCore.NPOI (1.2.1) 来读取 MS Excel 文件。
一些单元格是文本类型并包含格式化的字符串(例如一些粗体字)。
如何获取格式化的单元格值?我的最终目标:将单元格文本检索为 HTML。
我试过了
var cell = row.GetCell(1);
var richStringCellValue = cell.RichStringCellValue;
但这不会让我访问格式化的字符串(只是没有格式的普通字符串)。
有人有想法或解决方案吗?
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。
我想在这种情况下你将不得不走更长的路。首先,您必须维护日期、货币等单元格值的格式,然后从单元格值中提取样式并将单元格值嵌入到该样式下。
最好的选择是编写扩展方法来获取格式和样式值。
获取格式请看这个linkHow to get the value of cell containing a date and keep the original formatting using NPOI
对于样式,首先你必须检查并找到 运行 文本的确切样式,然后 return 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>.
}
}
}
我正在使用 DotNetCore.NPOI (1.2.1) 来读取 MS Excel 文件。
一些单元格是文本类型并包含格式化的字符串(例如一些粗体字)。
如何获取格式化的单元格值?我的最终目标:将单元格文本检索为 HTML。
我试过了
var cell = row.GetCell(1);
var richStringCellValue = cell.RichStringCellValue;
但这不会让我访问格式化的字符串(只是没有格式的普通字符串)。
有人有想法或解决方案吗?
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。
我想在这种情况下你将不得不走更长的路。首先,您必须维护日期、货币等单元格值的格式,然后从单元格值中提取样式并将单元格值嵌入到该样式下。
最好的选择是编写扩展方法来获取格式和样式值。
获取格式请看这个linkHow to get the value of cell containing a date and keep the original formatting using NPOI
对于样式,首先你必须检查并找到 运行 文本的确切样式,然后 return 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>.
}
}
}