Java——关于Excle表格的操作

简介: Java——关于Excle表格的操作

1.使用poi工具

pom.xml中添加依赖

<dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>3.17</version>
</dependency>

2.读取Excel源标题、源数据、总行数、总列数

/**
 * 读Excel的方法readExcel,该方法的入口参数为一个File对象
 * @param file
 * @return
 */
public static Map readExcel(File file) {
    Map map = new HashMap();
    try {
        // 创建输入流,读取Excel
        InputStream is = new FileInputStream(file.getAbsolutePath());
        // jxl提供的Workbook类
        jxl.Workbook wb = jxl.Workbook.getWorkbook(is);
        // Excel的页签数量
        int sheet_size = wb.getNumberOfSheets();
        if(sheet_size > 1){
            return null;
        }
        //获取原标题
        List oldTitleRow = new ArrayList();
        List<Object> outerList = new ArrayList<Object>();
        // 每个页签创建一个Sheet对象
        jxl.Sheet sheet = wb.getSheet(0);
        //sheet.getRows()返回该页的总行数
        for (int i = 0; i < sheet.getRows(); i++) {
            Map innerMap = new HashMap();
            String cellinfo = "";
            // sheet.getColumns()返回该页的总列数
            for (int j = 0; j < sheet.getColumns(); j++) {
                cellinfo = sheet.getCell(j, i).getContents();
                //如果是第3行,取出数据作为oldTitleRow行
                if(i == 2){
                    oldTitleRow.add(cellinfo);
                }
                if(i > 2){
                    innerMap.put(j, cellinfo);
                }
            }
            //只取出第3行以及第三之后的数据
            if(i > 2){
                outerList.add(innerMap);
            }
        }
        //保存源标题、源数据、总行数、总列数
        map.put("oldTitleRow", oldTitleRow);
        map.put("dataList", outerList);
        map.put("rowNum", sheet.getRows()-3);
        map.put("columnNum", sheet.getColumns());
        return map;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (BiffException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

3.导出excel表格

/**
 * 导出excel表格
 * @param dataList 被导出的数据
 * @param cloumnCount 总列数
 * @param newTitleRow 标题行
 * @param finalXlsxPath 导出路径
 */
public static void writeExcel(List<Map> dataList, int cloumnCount,List newTitleRow, String finalXlsxPath) {
    OutputStream out = null;
    try {
        // 获取总列数
        int columnNumCount = cloumnCount;
        // 创建空的Excel文档,并加上title
        createExcel(finalXlsxPath,"Template", newTitleRow);
        File finalXlsxFile = new File(finalXlsxPath);
        Workbook workBook = getWorkbok(finalXlsxFile);
        // sheet 对应一个工作页
        Sheet sheet = workBook.getSheetAt(0);
        // 创建文件输出流,输出电子表格:这个必须有,否则你在sheet上做的任何操作都不会有效
        out = new FileOutputStream(finalXlsxPath);
        workBook.write(out);
        /**
         * 往Excel中写新数据
         */
        for (int j = 0; j < dataList.size(); j++) {
            // 创建一行:从第二行开始,跳过属性列
            Row row = sheet.createRow(j + 1);
            // 得到要插入的每一条记录
            Map dataMap = dataList.get(j);
            for (int k = 0; k < columnNumCount; k++) {
                String data = dataMap.get(k).toString();
                // 在一行内循环
                Cell cell = row.createCell(k);
                cell.setCellValue(data);
            }
        }
        // 创建文件输出流,准备输出电子表格:这个必须有,否则你在sheet上做的任何操作都不会有效
        out = new FileOutputStream(finalXlsxPath);
        workBook.write(out);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (out != null) {
                out.flush();
                out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    System.out.println("数据导出成功");
}

4.创建新的excel表格

/**
 * 创建新excel
 * @param fileDir  excel的路径
 * @param sheetName 要创建的表格索引
 * @param newTitleRow 要创建的表格标题
 */
public static void createExcel(String fileDir,String sheetName, List<String> newTitleRow){
    //判断文件是否存在
    if(fileExist(fileDir)){
        deleteExcel(fileDir);
    }
    //创建workbook
    HSSFWorkbook workbook = new HSSFWorkbook();
    //添加Worksheet(不添加sheet时生成的xls文件打开时会报错)
    HSSFSheet sheet1 = workbook.createSheet(sheetName);
    //新建文件
    FileOutputStream out = null;
    try {
        //添加表头
        HSSFRow row = workbook.getSheet(sheetName).createRow(0);    //创建第一行
        for(int i = 0;i < newTitleRow.size();i++){
            HSSFCell cell = row.createCell(i);
            cell.setCellValue(newTitleRow.get(i));
        }
        out = new FileOutputStream(fileDir);
        workbook.write(out);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5.判断Excel文件版本

/**
 * 判断Excel的版本,获取Workbook
 * @param file
 * @return
 */
public static Workbook getWorkbok(File file) {
    Workbook wb = null;
    try {
        FileInputStream in = new FileInputStream(file);
        if (file.getName().endsWith(EXCEL_XLS)) {     //Excel&nbsp;2003
            wb = new HSSFWorkbook(in);
        } else if (file.getName().endsWith(EXCEL_XLSX)) {    // Excel 2007/2010
            wb = new XSSFWorkbook(in);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return wb;
}

6.其他

/**
 * 判断文件是否存在.
 * @param fileDir  文件路径
 * @return
 */
public static boolean fileExist(String fileDir){
    boolean flag = false;
    File file = new File(fileDir);
    flag = file.exists();
    return flag;
}
/**
 * 删除文件.
 * @param fileDir  文件路径
 */
public static boolean deleteExcel(String fileDir) {
    boolean flag = false;
    File file = new File(fileDir);
    // 判断目录或文件是否存在
    if (!file.exists()) {  // 不存在返回 false
        return flag;
    } else {
        // 判断是否为文件
        if (file.isFile()) {  // 为文件时调用删除文件方法
            file.delete();
            flag = true;
        }
    }
    return flag;
}

OK, GAME OVER!

相关文章
|
1月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
136 5
|
5月前
|
Java BI 数据处理
如何在Java中实现Excel操作
如何在Java中实现Excel操作
|
3月前
|
人工智能 JavaScript Java
java表格识别PaddleOcr总结
本文介绍了使用OpenCV和PaddleOCR进行表格识别的方法。通过OpenCV进行图像处理,并利用PaddleOCR进行文字识别。文中详细描述了在Windows和Linux环境下搭建PaddleOCR环境的过程,包括解决CMake依赖问题、生成DLL文件等。此外,还提供了C++代码示例说明如何导出识别结果,并探讨了Java环境下使用JNA进行复杂对象传递遇到的问题及解决方案。作者分享了在表格识别项目中的实践经验,包括处理模型转换和优化等方面的挑战。
java表格识别PaddleOcr总结
|
3月前
|
Java Apache Maven
java读取doc里的表格
java读取doc里的表格
68 9
|
2月前
|
Java Apache
Apache POI java对excel表格进行操作(读、写) 有代码!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
68 0
|
5月前
|
存储 Java 索引
Java ArrayList操作指南:如何移除并返回第一个元素
通过上述方法,你可以方便地从Java的 `ArrayList` 中移除并返回第一个元素。这种操作在日常编程中非常常见,是处理列表时的基本技能之一。希望这篇指南能帮助你更好地理解和运用Java的 `ArrayList`。
63 4
|
5月前
|
分布式计算 DataWorks Java
DataWorks操作报错合集之使用ODPS Tunnel Upload功能时,遇到报错:Java 堆内存不足,该如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
5月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
|
5月前
|
Java API 开发者
Java中的文件I/O操作详解
Java中的文件I/O操作详解
|
5月前
|
Java BI 数据处理
如何在Java中实现Excel操作
如何在Java中实现Excel操作