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 数据处理
|
5天前
|
数据采集 前端开发 测试技术
《手把手教你》系列技巧篇(三十一)-java+ selenium自动化测试- Actions的相关操作-番外篇(详解教程)
【4月更文挑战第23天】本文介绍了网页中的滑动验证码的实现原理和自动化测试方法。作者首先提到了网站的反爬虫机制,并表示在本地创建一个没有该机制的网页,然后使用谷歌浏览器进行验证。接着,文章详细讲解了如何使用WebElement的click()方法以及Action类提供的API来模拟鼠标的各种操作,如右击、双击、悬停和拖动。
8 2
|
6天前
|
Web App开发 数据采集 Java
《手把手教你》系列技巧篇(三十)-java+ selenium自动化测试- Actions的相关操作下篇(详解教程)
【4月更文挑战第22天】本文介绍了在测试过程中可能会用到的两个功能:Actions类中的拖拽操作和划取字段操作。拖拽操作包括基本讲解、项目实战、代码设计和参考代码,涉及到鼠标按住元素并将其拖动到另一个元素上或指定位置。划取字段操作则介绍了如何在一段文字中随机选取一部分,包括项目实战、代码设计和参考代码。此外,文章还提到了滑动验证的实现,并提供了相关的代码示例。
32 2
|
1月前
|
自然语言处理 Java
这是什么操作?java中的变量竟然可以先使用后声明?
这是什么操作?java中的变量竟然可以先使用后声明?
14 0
|
1月前
|
SQL Java
使用java中的String类操作复杂的字符串
使用java中的String类操作复杂的字符串
9 0
|
1月前
|
Java
java操作字符串
java操作字符串
9 1
|
1月前
|
Java 数据库 开发者
Java数组件与表格组件
Java数组件与表格组件
16 0
|
1月前
|
SQL Java 关系型数据库
Java查询操作
Java查询操作
9 0
|
2月前
|
Java Linux API
|
2月前
|
存储 Java
java Map集合相关介绍和方法使用操作
java Map集合相关介绍和方法使用操作
21 2