当前位置: 首页 > 知识库问答 >
问题:

无法使用apache poi从excel中检测删除线数据

夏侯博
2023-03-14

我在我的项目中使用Java8、excel和apache poi。我对使用Java从excel中提取某些单元格值很感兴趣。我试图检测excel单元格中删除的文本,但文本的格式几乎没有什么不同,这就是为什么我面临一些问题。

下面是我的excel工作表中数据的布局方式:

从excel中扩展此数据后,我总是将其保存为字符串arraylist格式,如下a=[text1,text2,text3]。如果您想了解我是如何在这个ArrayList中存储数据的,下面会提到代码。

为了检测删除线值,我先尝试了下面的代码:

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

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

在我的例子中,部分适用于单行单元格值的代码是:

如何将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

共有1个答案

赫连永怡
2023-03-14

您需要首先获取RichTextString,然后遍历所有formattingrun,检查它是否被删除,如果没有,则获取指定的子字符串并将其放入列表:

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();

 }
}
 类似资料:
  • viewuser.jsp 你好,我有问题在删除用户。它显示执行后输出失败。我认为它没有从ViewUser中获取用户名。请帮帮我.查询正常,数据库连接仍有问题,取用户名并删除。谢谢你!

  • 问题内容: 尝试使用ApachePOI打开Excel时,我得到 我检查了。没有创建这样的文件夹。我正在使用Apache POI 3.6版。 有什么帮助吗?类似的代码在其他工作区中运行良好。在这里不知所措。 码: 问题答案: 您为什么要制作一个非常好的文件,将其包装在中,然后要求POI必须为您缓冲整个文件,以便可以进行随机访问?如果直接将文件直接传递给POI,生活会好很多,因此可以根据需要跳过它!

  • 我修改了一小段代码,但无法运行。我总是发现一个例外: 保存失败:保存包时出错:重复条目:docProps/core.xml 错误抛出在这行: 我认为出现了这个例外,因为我不允许在同一个工作簿上读写,但是如果没有现有的Excel文件,我如何初始化新工作簿? 代码:(来自这里(感谢发起者):如何使用ApachePOI删除行) 和 [编辑2016-06-21]: 我加了 给我的POM,现在它产生了 线程

  • 用户可以将Excel文档保存为. xls或xml-table。结果是一个具有固定结构的xml-file,Excel可以用它纠正工作。 可以用java中的ApachePOI打开这种类型的excel文件吗? 事先谢谢你,安德烈。

  • 问题内容: 我一直在尝试删除我的excel文件中的空行的代码!我的代码是: 该代码完全无效。有谁能告诉我是什么问题,请帮助我,自最近10个小时以来,我一直在尝试做这件事。提前致谢! 问题答案: 当任何行为空白时,将有两种情况。 首先,该行位于其他行之间,但永远不会初始化或创建。在这种情况下, Sheet.getRow(i)将为null。 其次,行已创建,其单元格可能会或可能不会被使用,但现在其所有

  • 我想从Firebase中删除我的当前用户。经过身份验证的用户被删除,但是我无法删除数据库中该用户的数据。我做错了什么? 这是我的删除用户方法。。。。 Firebase规则: 数据库: 错误: 2017-01-21 21:33:10.321704应用程序[11582:4102711][FirebaseDatabase]设置值:或删除值:at/users/4erkjkl543jfe46失败:权限被拒绝