使用apache poi无法从excel中检测出三振数据

我为我的项目使用Java 8,Excel和apache poi。 有一些单元格值,我有兴趣使用java从e​​xcel中提取。 我正在尝试在excel单元格中检测文本,但文本的格式稍有不同,这就是为什么我面临一些问题。

以下是我在Excel表中列出的数据:

在这里输入图像说明 在这里输入图像说明

从excel中提取这些数据后,我总是把它保存为string数组列表格式,就像这样a = [text 1, text 2, text 3] 。 代码如下,如果你想看看我如何在这个数组列表中存储数据。

我想要的是:

我想忽略所有这些文字是三振,所以在上面的情况下,我希望有这样的输出[text 2, text 3]的第一张照片和第二张照片。

我试过的:

为了刚刚检测到三振值,我首先尝试了下面的代码:

 XSSFRichTextString text = new XSSFRichTextString(a.get(0)); XSSFFont font = text.getFontAtIndex(0); Boolean font_striked = font.getStrikeout(); 

但上面的代码不工作,因为font_striked返回null ,它必须返回true或false

在我的情况下在单行单元格值部分工作的代码是:

boolean striked_out = sheet.getRow(row_index).getCell(column_index).getCellStyle(). getFont().getStrikeout();

此代码仅适用于单元格中有单行值而不是上面显示的项目符号列表。 因为没有这样的文本,所以失败了。

PS我相信,如果能以某种方式检测出即使是从列表中删除的单个三振弦,我也可以使它适用于所有的数据。

根据下面的答案,我已经更新了我的问题添加以下代码,以显示如何使我的stringarraylist

我如何将Excel中的数据转换成Arraylist:

 String value_header = cell.getStringCellValue(); String[] newline_split = value_header.split("-"); for (int i = 0; i < newline_split.length; i++){ final_values = newline_split[i]. replace("\n"," ").replaceAll("\\s{2,}", " ").trim(); XSSFRichTextString text = new XSSFRichTextString(final_values); XSSFFont font = text.getFontAtIndex(0); Boolean font_striked = font.getStrikeout(); } // for ends here 

您将需要先获取RichTextString ,然后遍历所有的FormattingRun ,检查它是否被划出,只有没有,然后获取适当的子string,并将其放入List

 import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.CellType.*; import org.apache.poi.xssf.usermodel.*; import java.io.FileInputStream; import java.util.List; import java.util.ArrayList; class ReadExcelRichTextCells { public static void main(String[] args) throws Exception { Workbook wb = WorkbookFactory.create(new FileInputStream("ExcelRichTextCells.xlsx")); Sheet sheet = wb.getSheetAt(0); for (Row row : sheet) { for (Cell cell : row) { switch (cell.getCellTypeEnum()) { case STRING: XSSFRichTextString richtextstring = (XSSFRichTextString)cell.getRichStringCellValue(); String textstring = richtextstring.getString(); List<String> textparts = new ArrayList<String>(); if (richtextstring.hasFormatting()) { for (int i = 0; i < richtextstring.numFormattingRuns(); i++) { if (richtextstring.getFontOfFormattingRun(i)==null || !richtextstring.getFontOfFormattingRun(i).getStrikeout()) { int indexofformattingrun = richtextstring.getIndexOfFormattingRun(i); String textpart = textstring.substring(indexofformattingrun, indexofformattingrun + richtextstring.getLengthOfFormattingRun(i)); String[] textpart_split = textpart.split("-"); for (int j = 0; j < textpart_split.length; j++){ String text = textpart_split[j].replace("\n", "").trim(); if (!"".equals(text)) textparts.add(text); } } } } else { textparts.add(textstring); } System.out.println(textparts); break; //... default: System.out.println("default cell"); //should never occur } } } wb.close(); } } 

这是如何在Excel中使用VBA获取删除线:

 Public Sub IsMyActivecellStriked() Debug.Print ActiveCell.Font.Strikethrough End Sub 

如果你有这样的事情:

在这里输入图像说明

然后,你应该find一种方法来访问这些字符并检查它们。 喜欢这个:

 Option Explicit Public Sub TestMe() Dim strRange As String Dim varArr As Variant Dim varStr As Variant Dim lngStart As Long Dim lngEnd As Long strRange = [a1] varArr = Split(strRange, Chr(10)) For Each varStr In varArr lngStart = InStr(1, strRange, varStr) Debug.Print [a1].Characters(Start:=lngStart, Length:=Len(varStr)).Font.Strikethrough Debug.Print [a1].Characters(Start:=lngStart, Length:=Len(varStr)).Text Next varStr End Sub 

这将在下面的窗口给你:

 False aaa True bbb True ccc False ddd 

这应该可以通过POI库转换成Java。

根据我的理解上面的问题问题(PLZ纠正我,如果我错了!!)它应该显示您的单元格中的文本是否删除线。 ( 对或错)

下面我创build了一个演示:

 public class ApachePOI { public static void main(String[] args) { //Using workbook XSSFWorkbook workbook; try { //Access excel file as workbook workbook = new XSSFWorkbook(new FileInputStream(new File("/testExcelfile.xlsx"))); // first sheet of excel file XSSFSheet xssfFirstSheet = workbook.getSheetAt(0); //Check for A1 cell that strikethrough or not boolean strikedOutTextStatus = xssfFirstSheet.getRow(0).getCell(0).getCellStyle().getFont().getStrikeout(); //print status of A1 cell text System.out.println(strikedOutTextStatus); 

//更新代码

  if(strikedOutTextStatus){ String cellStringValue = xssfFirstSheet.getRow(0).getCell(0).getStringCellValue(); System.out.println("cell Value : "+cellStringValue.replace("-", "").replace(" ", "")); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }