使用apache poi无法从excel中检测出三振数据
我为我的项目使用Java 8,Excel和apache poi。 有一些单元格值,我有兴趣使用java从excel中提取。 我正在尝试在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(); } } }