欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java excel导入 导出

程序员文章站 2024-02-24 16:00:40
...

参照博客 :https://blog.csdn.net/HaHa_Sir/article/details/105231975
和https://www.cnblogs.com/weiyi1314/p/11686018.html

导入Excel

可以直接使用WorkbookFactory创建对象(但是超多6万多行会报错,没测试)

Workbook workbook = WorkbookFactory.create(inputStream);

导入的类

package com.orient.tdm201.vehicleCheck.business;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author xks
 * @date 2020/5/22 9:01
 * @description :
 */
public class ExcelImport {
    private ExcelImport INSTANSE = new ExcelImport();

    /**
     * excel 2003 suffix
     */
    private static final String EXCEL_XLS_SUFFIX = ".xls" ;

    /**
     * excel 2007 或以上 suffix
     */
    private static final String EXCEL_XLSX_SUFFIX = ".xlsx";

    /**
     * 分隔符 "."
     */
    public static final String POINT = ".";

    /**
     * description: 读取excel数据
     * @param file
     * @return List<List<Object>>
     * @version v1.0
     * @author w
     * @date 2020年3月31日 下午3:36:39
     */
    public static List<List<List<Object>>> importFile (File file) throws Exception{
        if(file == null) {
            return null ;
        }
        return readXls2(new FileInputStream(file));
//        if(file.getName().endsWith(EXCEL_XLS_SUFFIX)) {
//            return readXls(new FileInputStream(file));
//        }
//        if(file.getName().endsWith(EXCEL_XLSX_SUFFIX)) {
//            return readXlsx(new FileInputStream(file));
//        }
//
//        throw new RuntimeException("文件不对,必须是excel文件,后缀名以:"+EXCEL_XLS_SUFFIX + " 或者 "+ EXCEL_XLSX_SUFFIX);
    }

    /**
     * description: 导入excel --- 支持web
     * @param
     * @param
     * @throws Exception
     * @return List<List<Object>>
     * @version v1.0
     * @author w
     * @date 2020年3月31日 下午4:51:01
     */
    public static List<List<List<Object>>> importFile (MultipartFile multipartFile) throws Exception{
        if(multipartFile == null) {
            return null ;
        }
        /*if(multipartFile.getOriginalFilename().endsWith(EXCEL_XLS_SUFFIX)) {
            return readXls(multipartFile.getInputStream());
        }
        if(multipartFile.getOriginalFilename().endsWith(EXCEL_XLSX_SUFFIX)) {
            return readXlsx(multipartFile.getInputStream());
        }*/
        return readXls2(multipartFile.getInputStream());
//        throw new RuntimeException("文件不对,必须是excel文件,后缀名以:"+EXCEL_XLS_SUFFIX + " 或者 "+ EXCEL_XLSX_SUFFIX);
    }

    /**
     * 测试 workBookFactory  读取excel
     * @param inputStream
     * @return
     * @throws Exception
     */
    private static List<List<List<Object>>> readXls2(InputStream inputStream) throws Exception {
        List<List<List<Object>>> list = new ArrayList<>();
        // 读取excel
//        HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
        Workbook workbook = WorkbookFactory.create(inputStream);
        // 获取sheet 页数量
        int sheets = workbook.getNumberOfSheets();
        for(int num = 0 ; num < sheets ; num++ ) {
            Sheet sheet = workbook.getSheetAt(num);
            List<List<Object>> list1= new ArrayList<>();

            if(null == sheet) {
                continue ;
            }
            // sheet 页的总行数
            int rows = sheet.getLastRowNum();
            // startRow 开始读取的行数 --- 第二行开始读
            for( int startRow = 1 ;startRow <= rows  ; startRow ++) {
                Row row = sheet.getRow(startRow);
                List<Object> rowList = new ArrayList<>();
                if(null != row) {
                    // row 行中的 单元格总个数
                    short cells = row.getLastCellNum();
                    for(int x = 0 ; x <= cells ; x++) {
                        Cell cell = row.getCell(x);
                        if(null == cell) {
                            rowList.add("");
                        }else {
                            rowList.add(getXlsxValue2(cell));
                        }
                    }
                    list1.add(rowList);
                }
            }
            list.add(list1);
        }
        return list;
    }

    /**
     * 测试 workBookFactory  获得cell的值
     * @param cell
     * @return
     */
    private static Object getXlsxValue2(Cell cell) {
        Object cellValue = null;
        if (cell != null) {
            //判断cell类型
            switch (cell.getCellType()) {
                case Cell.CELL_TYPE_NUMERIC: {
                    cellValue = String.valueOf(cell.getNumericCellValue());
                    break;
                }
                case Cell.CELL_TYPE_FORMULA: {
                    //判断cell是否为日期格式
                    if (DateUtil.isCellDateFormatted(cell)) {
                        //转换为日期格式YYYY-mm-dd
                        cellValue = cell.getDateCellValue();
                    } else {
                        //数字
                        cellValue = String.valueOf(cell.getNumericCellValue());
                    }
                    break;
                }
                case Cell.CELL_TYPE_STRING: {
                    cellValue = cell.getRichStringCellValue().getString();
                    break;
                }
                default:
                    cellValue = "";
            }
        } else {
            cellValue = "";
        }
        return cellValue;
    }


    /**
     * description: 读取03版excel
     * @param
     * @return List<List<Object>>
     * @version v1.0
     * @author w
     * @date 2020年3月31日 下午3:38:44
     */
    private static List<List<Object>> readXls(InputStream inputStream) throws Exception {
        List<List<Object>> list = new ArrayList<>();
        // 读取excel
        HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
        // 获取sheet 页数量
        int sheets = workbook.getNumberOfSheets();
        for(int num = 0 ; num < sheets ; num++ ) {
            HSSFSheet sheet = workbook.getSheetAt(num);
            if(null == sheet) {
                continue ;
            }
            // sheet 页的总行数
            int rows = sheet.getLastRowNum();
            // startRow 开始读取的行数 --- 第二行开始读
            for( int startRow = 1 ;startRow <= rows  ; startRow ++) {
                HSSFRow row = sheet.getRow(startRow);
                List<Object> rowList = new ArrayList<>();
                if(null != row) {
                    // row 行中的 单元格总个数
                    short cells = row.getLastCellNum();
                    for(int x = 0 ; x <= cells ; x++) {
                        HSSFCell cell = row.getCell(x);
                        if(null == cell) {
                            rowList.add("");
                        }else {
                            rowList.add(getXlsValue(cell));
                        }
                    }
                    list.add(rowList);
                }
            }
        }
        return list;
    }

    /**
     * description: 获取 03 版 excel数据
     * @param cell
     * @return String
     * @version v1.0
     * @author w
     * @date 2020年3月31日 下午3:54:14
     */
    private static String getXlsValue(HSSFCell cell) {
        if ( cell.getCellType() == cell.CELL_TYPE_BOOLEAN) {
            return String.valueOf(cell.getBooleanCellValue());
        } else if (cell.getCellType() == cell.CELL_TYPE_NUMERIC) {
            String cellValue = "";
            if(HSSFDateUtil.isCellDateFormatted(cell)){
                Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
                cellValue = new SimpleDateFormat("yyyy/MM/dd").format(date);
            }else{
                DecimalFormat df = new DecimalFormat("#.##");
                cellValue = df.format(cell.getNumericCellValue());
                String strArr = cellValue.substring(cellValue.lastIndexOf(POINT)+1,cellValue.length());
                if(strArr.equals("00")){
                    cellValue = cellValue.substring(0, cellValue.lastIndexOf(POINT));
                }
            }
            return cellValue;
        } else {
            // 其他类型的值,统一设置为 string
            // http://blog.csdn.net/ysughw/article/details/9288307
            cell.setCellType(Cell.CELL_TYPE_STRING);
            return String.valueOf(cell.getStringCellValue());
        }
    }

    /**
     * description: 读取07或以上版本的 excel
     * @param
     * @throws Exception
     * @return List<List<Object>>
     * @version v1.0
     * @author w
     * @date 2020年3月31日 下午4:01:25
     */
    private static List<List<Object>> readXlsx(InputStream inputStream) throws Exception {
        List<List<Object>> list = new ArrayList<>();
        // 读取excel ,封装到 XSSFWorkbook 对象
        XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
        int sheets = workbook.getNumberOfSheets();
        for(int num = 0 ;num < sheets ; num++) {
            XSSFSheet sheet = workbook.getSheetAt(num);
            if(null == sheet) {
                continue ;
            }
            // 获取sheet页的总行数
            int rows = sheet.getLastRowNum();
            for(int startRow = 1 ; startRow <= rows ; startRow++ ) {
                // startRow 开始读取的行数, 从第二行开始读取
                XSSFRow row = sheet.getRow(startRow);
                List<Object> rowList = new ArrayList<>();
                if(null != row) {
                    // 获取行总单元格个数
                    short cells = row.getLastCellNum();
                    for(int x = 0 ; x < cells ; x++) {
                        XSSFCell cell = row.getCell(x);
                        if(cell == null) {
                            rowList.add("");
                        }else {
                            rowList.add(getXlsxValue(cell));
                        }
                    }
                    list.add(rowList);
                }
            }
        }
        return list;
    }

    /**
     * description: 获取07或以上版本 excel 数据
     * @param cell
     * @return Object
     * @version v1.0
     * @author w
     * @date 2020年3月31日 下午4:09:03
     */
    private static Object getXlsxValue(XSSFCell cell) {
        if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
            return String.valueOf(cell.getBooleanCellValue());
        } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
            String cellValue = "";
            if (DateUtil.isCellDateFormatted(cell)) {
                Date date = DateUtil.getJavaDate(cell.getNumericCellValue());
                cellValue = new SimpleDateFormat("yyyy/MM/dd").format(date);
            } else {
                DecimalFormat df = new DecimalFormat("#.##");
                cellValue = df.format(cell.getNumericCellValue());
                String strArr = cellValue.substring(cellValue.lastIndexOf(POINT) + 1, cellValue.length());
                if (strArr.equals("00")) {
                    cellValue = cellValue.substring(0, cellValue.lastIndexOf(POINT));
                }
            }
            return cellValue;
        } else {
            // 其他类型的值,统一设置为 string
            // http://blog.csdn.net/ysughw/article/details/9288307
            //cell.setCellType(Cell.CELL_TYPE_STRING);
            return String.valueOf(cell.getStringCellValue());
        }
    }

}

测试导入类代码
package com.orient.tdm201.vehicleCheck.business;

import java.io.File;
import java.util.List;

/**

  • @author xks

  • @date 2020/5/22 9:06

  • @description : 导入Excel c测试
    */
    public class TestImportExcel {
    public static void main(String[] args) {
    String path = “D:\test3.xlsx” ;
    File file = new File(path);
    try {
    List<List<List>> importFile = ExcelImport.importFile(file);
    System.out.println(importFile);
    } catch (Exception e) {
    e.printStackTrace();
    }

    }
    }

导出Excel

导出工具类

package com.orient.tdm201.vehicleCheck.business;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;

import java.io.OutputStream;
import java.util.List;

/**
 * @author xks
 * @date 2020/5/21 22:17
 * @description :
 */
public class ExportExcelUtilsTest {
    public void exportExcel(Workbook workbook, int sheetNum,
                            String sheetTitle, String[] headers, List<List<String>> result,
                            OutputStream out) throws Exception {
// 生成一个表格
        Sheet sheet = workbook.createSheet();
        workbook.setSheetName(sheetNum, sheetTitle);
// 设置表格默认列宽度为20个字节
        sheet.setDefaultColumnWidth((short) 20);
// 生成一个样式
        CellStyle style = workbook.createCellStyle();
// 设置这些样式
        style.setFillForegroundColor(HSSFColor.PALE_BLUE.index);

        style.setFillBackgroundColor(HSSFColor.WHITE.index);
        style.setFillForegroundColor(HSSFColor.LIGHT_ORANGE.index);

// 生成一个字体
        Font font = workbook.createFont();
        font.setColor(HSSFColor.BLACK.index);
        font.setFontHeightInPoints((short) 12);

      /*  // 设置字体
       Font font = workbook.createFont();
        font.setFontHeightInPoints((short) 20); // 字体高度
         font.setColor(Font.COLOR_RED); // 字体颜色
         font.setFontName("黑体"); // 字体
         font.setBoldweight(Font.BOLDWEIGHT_BOLD); // 宽度
        font.setItalic(true); // 是否使用斜体*/
         // font.setStrikeout(true); //是否使用划线
// 把字体应用到当前的样式
        style.setFont(font);

// 指定当单元格内容显示不下时自动换行
        style.setWrapText(true);

// 产生表格标题行
        Row row = sheet.createRow(0);
        for (int i = 0; i < headers.length; i++) {
            Cell cell = row.createCell((short) i);

            cell.setCellStyle(style);
            HSSFRichTextString text = new HSSFRichTextString(headers[i]);
            cell.setCellValue(text.toString());
        }
// 遍历集合数据,产生数据行
        if (result != null) {
            int index = 1;
            for (List<String> m : result) {
                row = sheet.createRow(index);
                int cellIndex = 0;
                for (String str : m) {
                    Cell cell = row.createCell((short) cellIndex);
                    cell.setCellValue(str.toString());
                    cellIndex++;
                }
                index++;
            }
        }
    }
}

导出测试类


package com.orient.tdm201.vehicleCheck.business;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * @author xks
 * @date 2020/5/21 22:11
 * @description : 导出Excel 测试
 */
public class TestExcel {
    public static void main(String[] args) {
        try {
            File f = new File("d:" + File.separator + "test5.xls");
            OutputStream out = new FileOutputStream(f);//导出本地
//OutputStream out = response.getOutputStream();//输出客户端
            List<List<String>> data1 = new ArrayList<List<String>>();
            List<List<String>> data2 = new ArrayList<List<String>>();
            List<List<String>> data3 = new ArrayList<List<String>>();
            for (int i = 1; i < 5; i++) {
                List rowData = new ArrayList();
                rowData.add(String.valueOf(i));
                rowData.add("上海东霖柏鸿");
                data1.add(rowData);
            }
            for (int i = 1; i < 5; i++) {
                List rowData = new ArrayList();
                rowData.add(String.valueOf(i));
                rowData.add("深圳东霖柏鸿");
                data2.add(rowData);
            }
            for (int i = 1; i < 5; i++) {
                List rowData = new ArrayList();
                rowData.add(String.valueOf(i));
                rowData.add("广州东霖柏鸿");
                data3.add(rowData);
            }
            String[] headers1 = {"ID1", "用户名1"};
            String[] headers2 = {"ID2", "用户名2"};
            String[] headers3 = {"ID3", "用户名3"};
            ExportExcelUtilsTest eeu = new ExportExcelUtilsTest();//工具类写法在下面
            HSSFWorkbook workbook = new HSSFWorkbook();
            //使用WorkbookFactory  将excel也编译了  参考:https://blog.csdn.net/Chilies/article/details/80986322
//            Workboo/k workbook = WorkbookFactory.create()
            eeu.exportExcel(workbook, 0, "上海", headers1, data1, out);
            eeu.exportExcel(workbook, 1, "深圳", headers2, data2, out);
            eeu.exportExcel(workbook, 2, "广州", headers3, data3, out);
//原理就是将所有的数据一起写入,然后再关闭输入流。
            workbook.write(out);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
 1. **全新的界面设计** ,将会带来全新的写作体验;
 2. 在创作中心设置你喜爱的代码高亮样式,Markdown **将代码片显示选择的高亮样式** 进行展示;
 3. 增加了 **图片拖拽** 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
 4. 全新的 **KaTeX数学公式** 语法;
 5. 增加了支持**甘特图的mermaid语法[^1]** 功能;
 6. 增加了 **多屏幕编辑** Markdown文章功能;
 7. 增加了 **焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置** 等功能,功能按钮位于编辑区域与预览区域中间;
 8. 增加了 **检查列表** 功能。
 [^1]: [mermaid语法说明](https://mermaidjs.github.io/)

## 功能快捷键

撤销:<kbd>Ctrl/Command</kbd> + <kbd>Z</kbd>
重做:<kbd>Ctrl/Command</kbd> + <kbd>Y</kbd>
加粗:<kbd>Ctrl/Command</kbd> + <kbd>B</kbd>
斜体:<kbd>Ctrl/Command</kbd> + <kbd>I</kbd>
标题:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>H</kbd>
无序列表:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>U</kbd>
有序列表:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>O</kbd>
检查列表:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>C</kbd>
插入代码:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>K</kbd>
插入链接:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>L</kbd>
插入图片:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>G</kbd>
查找:<kbd>Ctrl/Command</kbd> + <kbd>F</kbd>
替换:<kbd>Ctrl/Command</kbd> + <kbd>G</kbd>

## 合理的创建标题,有助于目录的生成

直接输入1次<kbd>#</kbd>,并按下<kbd>space</kbd>后,将生成1级标题。
输入2次<kbd>#</kbd>,并按下<kbd>space</kbd>后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用`TOC`语法后生成一个完美的目录。

## 如何改变文本的样式

*强调文本* _强调文本_

**加粗文本** __加粗文本__

==标记文本==

~~删除文本~~

> 引用文本

H~2~O is是液体。

2^10^ 运算结果是 1024.

## 插入链接与图片

链接: [link](https://www.csdn.net/).

图片: ![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw)

带尺寸的图片: ![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw =30x30)

居中的图片: ![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw#pic_center)

居中并且带尺寸的图片: ![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw#pic_center =30x30)

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

## 如何插入一段漂亮的代码片

去[博客设置](https://mp.csdn.net/console/configBlog)页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 `代码片`.
```javascript
// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to-HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。1

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ(n)=(n1)!nN\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通过欧拉积分

Γ(z)=0tz1etdt. \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06Mon 13Mon 20已完成 进行中 计划一 计划二 现有任务Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三李四王五你好!李四, 最近怎么样?你最近怎么样,王五?我很好,谢谢!我很好,谢谢!李四想了很长时间,文字太长了不适合放在一行.打量着王五...很好... 王五, 你怎么样?张三李四王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0开始我的操作确认?结束yesno
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. 注脚的解释 ↩︎

相关标签: java java excel