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

细胞类型上的 Apache POI 4.0.0 编译错误

蓝侯林
2023-03-14

编译失败,出现以下错误:

cannot find symbol
case FORMULA:
symbol: variable FORMULA

同样的错误发生在下一个案例中。

我在Java 8中使用Apache POI 4.0.0。

我的代码是:

try (Workbook wb = WorkbookFactory.create(inputStream)) {
    Sheet sheet = wb.getSheetAt(0);
        for (Row row : sheet) {
            for (Cell cell : row) {
                switch (cell.getCellType()) {
                    case FORMULA:
                        [code]
                        break;
                }
            }
        }
}

注意1:从NetBeans 8.2部署到本地GlassFish 4.1.2可以工作,但是构建失败。

注2:如果我将“getCellType”替换为“getCell TypeEnum”(已弃用),则构建完成时不会出错。

版本:

  • Java1.8u172(i586)/然后Java1.8u181(i586)
  • poi-4.0.0
  • poi-oo xml-4.0.0
  • poi-oo xml-架构-4.0.0
  • xml bean-3.0.1
  • Commons-编解码器-1.11
  • Commons-集合4-4.2
  • Commons-日志记录-1.2
  • Commons-数学3-3.6.1
  • jsf-api-2.2.15
  • jsf-i mpl-2.2.15
  • primeface-6.2.6
package fr.mycompany.config.files;

import fr.mycompany.config.exception.MyAppException;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.faces.application.FacesMessage;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.usermodel.CellType;

public class POIUtils {

    public static List<List<String>> parseExcelFile(InputStream is) throws MyAppException {

        List<List<String>> lines = new ArrayList<>();

        try (Workbook wb = WorkbookFactory.create(is)) {
            Sheet sheet = wb.getSheetAt(0);
            DataFormatter df = new DataFormatter(true);
            int numRow = 0;
            for (Row row : sheet) {
                int numCol = 0;
                List<String> currentLine = new ArrayList<>();
                for (Cell cell : row) {
                    switch (cell.getCellType()) {
                        case FORMULA:
                            currentLine.add(numCol, "");
                            break;
                        case NUMERIC:
                            if (DateUtil.isCellDateFormatted(cell)) {
                                LocalDate ld = cell.getDateCellValue().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
                                String frLocalDate = ld.format(DateTimeFormatter.ofPattern("dd/MM/yyyy", Locale.FRANCE));
                                currentLine.add(numCol, frLocalDate);
                            } else {
                                String cellValue = df.formatCellValue(cell);
                                currentLine.add(numCol, cellValue);
                            }
                            break;
                        default:
                            String cellValue = df.formatCellValue(cell);
                            currentLine.add(numCol, cellValue);
                            break;
                    }
                    numCol++;
                }
                while (row.getRowNum() > numRow) {
                    lines.add(new ArrayList<>());
                    numRow++;
                }
                lines.add(row.getRowNum(), currentLine);
                numRow++;
            }
            if (lines.isEmpty()) {
                throw new MyAppException(FacesMessage.SEVERITY_WARN, "Le fichier est vide.");
            }
        } catch (IOException ex) {
            throw new MyAppException(FacesMessage.SEVERITY_FATAL, "Une erreur est survenue lors du traitement du fichier.", ex);
        } catch (EncryptedDocumentException ex) {
            throw new MyAppException(FacesMessage.SEVERITY_FATAL, "Le fichier est protégé par un mot de passe et n'a pas pu être lu.", ex);
        }

        return lines;

    }    

}
package fr.mycompany.coordination;

import fr.mycompany.config.exception.MyAppException;
import fr.mycompany.config.files.POIUtils;
import java.io.Serializable;
import java.io.IOException;
import javax.faces.application.FacesMessage;
import javax.inject.Named;
import javax.faces.view.ViewScoped;
import java.util.List;
import java.util.ArrayList;
import org.apache.poi.poifs.filesystem.FileMagic;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.UploadedFile;

@Named
@ViewScoped
public class FileImportBean implements Serializable {

    private transient UploadedFile file;
    private List<List<String>> parsedContent = new ArrayList<>();

    public void handleFileUpload (FileUploadEvent event) {
        try {
            file = event.getFile();
            if (null != file) {
                switch (FileMagic.valueOf(FileMagic.prepareToCheckMagic(file.getInputstream()))) {
                    case OOXML:
                        parsedContent = POIUtils.parseExcelFile(file.getInputstream());
                        break;
                    default:
                        (new MyAppException(FacesMessage.SEVERITY_ERROR, "Type de fichier non géré.", ex)).doFacesMessage();
                        break;
                }
            } else {
            }
        } catch (IOException ex) {
            (new MyAppException(FacesMessage.SEVERITY_FATAL, "Une erreur est survenue lors du traitement du fichier.", ex)).doFacesMessage();
        } catch (MyAppException ex) {
            ex.doFacesMessage();
        }
    }

}
<h:form enctype="multipart/form-data">
    <p:messages showDetail="true" />
    <p:fileUpload
        mode="advanced"
        skinSimple="true"
        auto="true"
        multiple="false"
        required="true"
        update="@form"
        fileUploadListener="#{fileImportBean.handleFileUpload}"
</h:form>

共有1个答案

屈翰飞
2023-03-14

感谢@AxelRichter在评论部分提出的想法,我发现我包含了一个JAR(由我的一位同事制作),它使用了旧版本的POI(3.15)。我也把这个升级到了4.0.0,瞧!至少我今天学到了一些东西…谢谢!

 类似资料:
  • 从事maven项目。我试图使用maven进行构建,但我遇到了以下错误!我正在使用JDK 8开发eclipse。 无法执行目标org.apache.maven.plugins:maven-compiler-plugin:2.3.2:编译(默认编译) 我也尝试了上面的解决方案,但我仍然得到错误!

  • 我的项目涉及一个带有自定义表格模型的JTable。因为我希望用户能够修改表中的每个单元格,所以我选择让我的自定义TableModel(CSVModel)扩展DefaultTableModel。然而,由于某些原因,当我试图编辑表中的单元格时,CSVModel会抛出一个异常。我得到的唯一提示来自堆栈跟踪的最后一行: java线程“AWT-EventQueue-0”中出现异常。lang.ArrayInd

  • 问题内容: 第14行发生了错误。 线程“主”中的异常java.lang.RuntimeException:无法编译的源代码-错误的sym类型: 很难找到解决方案。 问题答案: 您提供的代码在我的计算机上运行良好。 我猜您正在使用Netbeans,并且可能会受到错误的影响。试试这个: 打开项目属性,选择Build-Compiling,取消选中“保存时编译”,然后重新运行应用程序。这样可以确保在运行之

  • 细胞自动机(CA)是一个世界的模型,带有非常简单的物理。 “细胞”的意思是世界被分成一个大口袋,称为细胞。 “自动机”是一台执行计算的机器 - 它可能是一台真机。 ,但更多时候,“机器”是数学抽象或计算机的模拟。 本章介绍了史蒂文沃尔夫勒姆(Steven Wolfram)在 20 世纪 80 年代进行的实验,表明一些细胞自动机展示出令人惊讶的复杂行为,包括执行任意计算的能力。 我讨论了这些结果的含

  • 首先是一些背景。正如C 17标准所述: [vector.overview]/3如果分配器满足分配器完整性要求17.6,则在实例化vector时可使用不完整类型T。3.5.1.T应在引用向量的任何结果特化成员之前完成。 我在本回购协议中尝试了3种方案(代码复制在底部): 包含不完整向量类型的类在同一头文件中声明(默认ctor/dtor)并定义 编译用b. h包括: 编译用b. h包括: 我的问题是,

  • 我尝试用g 4.7.2编译以下内容: 它给了我 为什么? 谢谢。