前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Excel工具类

Excel工具类

作者头像
码客说
发布2019-10-22 14:00:09
6510
发布2019-10-22 14:00:09
举报
文章被收录于专栏:码客码客

代码

代码语言:javascript
复制
package com.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List; 
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/**
 * Excel工具类
 * 
 * @作者 张剑
 * @版本 1.3
 * @日期 2014年8月22日
 * @时间 上午10:39:10
 * @更新 张剑--2014年8月22日--1.1--添加读取Excel为String[][]
 * @更新 张剑--2014年8月22日--1.2--关闭输入输出流 抛出异常
 * @更新 张剑--2014年8月25日--1.3--修改读取代码
 */
public class ZJ_ExcelUtils {

    /**
     * 设置下载头,防止文件名乱码
     * 
     * @param request
     * @param response
     * @param fileName
     */
    public static void setFileDownloadHeader(HttpServletRequest request, HttpServletResponse response, String fileName) {
        final String userAgent = request.getHeader("USER-AGENT");
        try {
            String finalFileName = null;
            if (StringUtils.contains(userAgent, "Firefox")) {// google,火狐浏览器
                finalFileName = new String(fileName.getBytes(), "ISO8859-1");
            } else {
                finalFileName = URLEncoder.encode(fileName, "UTF8");// 其他浏览器
            }
            response.setHeader("Content-Disposition", "attachment; filename=\"" + finalFileName + "\"");// 这里设置一下让浏览器弹出下载提示框,而不是直接在浏览器中打开
        } catch (UnsupportedEncodingException e) {
        }
    }

    /**
     * *
     * 
     * @param filename
     *            保存到客户端的文件名 例:用户.xls
     * @param title
     *            标题行 例:String[]{"名称","地址"}
     * @param key
     *            从查询结果List取得的MAP的KEY顺序, 需要和title顺序匹配,
     *            例:String[]{"name","address"}
     * @param values
     *                 List<Map<String, String>> values=new ArrayList<Map<String,String>>();
     *                 Map<String, String> m=new HashMap<String, String>();
     *                 m.put("name", "zhangjian");
     *                m.put("address", "郑州");
     *                values.add(m);
     *            结果集
     * @param httpServletResponse
     * @throws IOException
     */
    public static void createExcel(String fileName, String[] title, String[] key, List<Map<String, String>> values, HttpServletRequest request, HttpServletResponse response) throws IOException {
        setFileDownloadHeader(request, response, fileName);
        HSSFWorkbook workbook = null;
        response.setContentType("application/x-download");
        response.setCharacterEncoding("UTF-8");
        workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet();
        HSSFRow row = null;
        HSSFCell cell = null;
        row = sheet.createRow(0);
        for (int i = 0; title != null && i < title.length; i++) {
            cell = row.createCell(i);
            cell.setCellType(HSSFCell.CELL_TYPE_STRING);
            cell.setCellValue(new HSSFRichTextString(title[i]));
        }
        Map<String, String> map = null;
        for (int i = 0; values != null && i < values.size(); i++) {
            row = sheet.createRow(i + 1);
            map = values.get(i);
            for (int i2 = 0; i2 < key.length; i2++) {
                cell = row.createCell(i2);
                cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                if (map.get(key[i2]) == null) {
                    cell.setCellValue(new HSSFRichTextString(""));
                } else {
                    cell.setCellValue(new HSSFRichTextString(map.get(key[i2]).toString()));
                }
            }
        }
        ServletOutputStream servletOutputStream = null;
        try {
            servletOutputStream = response.getOutputStream();
            workbook.write(servletOutputStream);
        }finally {
            if (null != servletOutputStream) {
                servletOutputStream.flush();
                servletOutputStream.close();
            }
        }
    }

    /**
     * 导出到文件
     * 
     * @param outputStream
     * @param title
     *            String[]
     * @param key
     *            String[]
     * @param values
     *            List<Map<String, String>>
     * @throws IOException
     */
    public static void createExcel(OutputStream outputStream, String[] title, String[] key, List<Map<String, String>> values) throws IOException {
        HSSFWorkbook workbook = null;
        workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet();
        HSSFRow row = null;
        HSSFCell cell = null;
        row = sheet.createRow(0);
        for (int i = 0; title != null && i < title.length; i++) {
            cell = row.createCell(i);
            cell.setCellType(HSSFCell.CELL_TYPE_STRING);
            cell.setCellValue(new HSSFRichTextString(title[i]));
        }
        Map<String, String> map = null;
        for (int i = 0; values != null && i < values.size(); i++) {
            row = sheet.createRow(i + 1);
            map = values.get(i);
            for (int i2 = 0; i2 < key.length; i2++) {
                cell = row.createCell(i2);
                cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                if (map.get(key[i2]) == null) {
                    cell.setCellValue(new HSSFRichTextString(""));
                } else {
                    cell.setCellValue(new HSSFRichTextString(map.get(key[i2]).toString()));
                }
            }
        }
        ServletOutputStream servletOutputStream = null;
        try {
            workbook.write(outputStream);
        } finally {
            if (null != servletOutputStream) {
                servletOutputStream.flush();
                servletOutputStream.close();
            }
        }
    }

    /**
     * 导出到文件
     * 
     * @param outputStream
     * @param values
     * @throws IOException
     */
    public static void createExcel(OutputStream outputStream, List<Map<String, String>> values) throws IOException {
        HSSFWorkbook workbook = null;
        workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet();
        HSSFRow row = null;
        HSSFCell cell = null;
        row = sheet.createRow(0);
        Object[] title = null;
        // 添加标题
        if (values.size() > 0) {
            title = values.get(0).keySet().toArray();
            for (int i = 0; title != null && i < title.length; i++) {
                cell = row.createCell(i);
                cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                cell.setCellValue(title[i].toString());
            }
        }

        Map<String, String> map = null;
        for (int i = 0; values != null && i < values.size(); i++) {
            row = sheet.createRow(i + 1);
            map = values.get(i);
            for (int i2 = 0; i2 < title.length; i2++) {
                cell = row.createCell(i2);
                cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                if (map.get(title[i2]) == null) {
                    cell.setCellValue("");
                } else {
                    cell.setCellValue(map.get(title[i2]).toString());
                }
            }
        }
        ServletOutputStream servletOutputStream = null;
        try {
            workbook.write(outputStream);
        } finally {
            if (null != servletOutputStream) {
                servletOutputStream.flush();
                servletOutputStream.close();
            }
        }
    }

    /**
     * 导出到文件
     * 
     * @param outputStream
     * @param title
     *            String[]
     * @param values
     *            List<String[]>
     * @throws IOException
     */
    public static void createExcel(OutputStream outputStream, String[] title, List<String[]> values) throws IOException {
        HSSFWorkbook workbook = null;
        workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet();
        HSSFRow row = null;
        HSSFCell cell = null;
        row = sheet.createRow(0);
        for (int i = 0; title != null && i < title.length; i++) {
            cell = row.createCell(i);
            cell.setCellType(HSSFCell.CELL_TYPE_STRING);
            cell.setCellValue(new HSSFRichTextString(title[i]));
        }
        String[] strArray = null;
        for (int i = 0; values != null && i < values.size(); i++) {
            row = sheet.createRow(i + 1);
            strArray = values.get(i);
            for (int i2 = 0; i2 < strArray.length; i2++) {
                cell = row.createCell(i2);
                cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                if (strArray[i2] == null) {
                    cell.setCellValue(new HSSFRichTextString(""));
                } else {
                    cell.setCellValue(strArray[i2].toString());
                }
            }
        }
        ServletOutputStream servletOutputStream = null;
        try {
            workbook.write(outputStream);
        } finally {
            if (null != servletOutputStream) {
                servletOutputStream.flush();
                servletOutputStream.close();
            }
        }
    }

    /**
     * 读取excel(第一行必须为标题)
     * 
     * @param filePath
     * @return
     * @throws IOException
     * @throws FileNotFoundException
     */
    public static List<Map<String, String>> getMapListByExcelFilePath(String filePath) throws FileNotFoundException, IOException {
        File file = new File(filePath);
        List<Map<String, String>> list = getMapListByExcelFile(file);
        return list;
    }

    /**
     * 读取excel(第一行必须为标题)
     * 
     * @param file
     * @return
     * @throws IOException
     * @throws FileNotFoundException
     */
    public static List<Map<String, String>> getMapListByExcelFile(File file) throws FileNotFoundException, IOException {
        List<Map<String, String>> list = new LinkedList<Map<String, String>>();
        FileInputStream fileInputStream = null;
        try {
            // 创建对Excel工作簿文件的引用
            fileInputStream = new FileInputStream(file);
            HSSFWorkbook wookbook = new HSSFWorkbook(fileInputStream);
            // 在Excel文档中,第一张工作表的缺省索引是0
            HSSFSheet sheet = wookbook.getSheetAt(0);
            // 获取到Excel文件中的所有行数
            int rows = sheet.getPhysicalNumberOfRows();
            int columns = 0;
            HSSFRow titleRow = null;
            if (rows > 0) {
                titleRow = sheet.getRow(0);
                columns = titleRow.getPhysicalNumberOfCells();
            }
            // 遍历行
            for (int i = 1; i < rows; i++) {
                Map<String, String> map = new HashMap<String, String>();
                HSSFRow row = sheet.getRow(i);
                if (row != null) {

                    // 遍历列
                    for (int j = 0; j < columns; j++) {
                        // 获取到列的值
                        HSSFCell cell = row.getCell(j);
                        if (cell != null) {
                            switch (cell.getCellType()) {
                            case HSSFCell.CELL_TYPE_NUMERIC:
                                map.put(titleRow.getCell(j).getStringCellValue(), cell.getNumericCellValue() + "");
                                break;
                            case HSSFCell.CELL_TYPE_STRING:
                                map.put(titleRow.getCell(j).getStringCellValue(), cell.getStringCellValue());
                                break;
                            case HSSFCell.CELL_TYPE_FORMULA:
                                map.put(titleRow.getCell(j).getStringCellValue(), cell.getNumericCellValue() + "");
                                break;
                            case HSSFCell.CELL_TYPE_BLANK:
                                map.put(titleRow.getCell(j).getStringCellValue(), "");
                                break;
                            case HSSFCell.CELL_TYPE_BOOLEAN:
                                map.put(titleRow.getCell(j).getStringCellValue(), cell.getBooleanCellValue() + "");
                                break;
                            default:
                                map.put(titleRow.getCell(j).getStringCellValue(), null);
                                break;
                            }
                        }
                    }
                    list.add(map);
                }
            }
            return list;
        } finally {
            if (null != fileInputStream) {
                fileInputStream.close();
            }
        }
    }

    /**
     * 读取Excel转为二维数组
     * 
     * @param file
     * @return
     * @throws IOException
     * @throws FileNotFoundException
     */
    public static String[][] getStrArrayByExcelFile(File file) throws FileNotFoundException, IOException {
        String[][] strArray = null;
        FileInputStream fileInputStream = null;
        fileInputStream = new FileInputStream(file);
        try {
            // 创建对Excel工作簿文件的引用
            HSSFWorkbook wookbook = new HSSFWorkbook(fileInputStream);
            // 在Excel文档中,第一张工作表的缺省索引是0
            HSSFSheet sheet = wookbook.getSheetAt(0);
            // 获取到Excel文件中的所有行数
            int rows = sheet.getPhysicalNumberOfRows();
            int cellNum = 0;
            if (rows > 0) {
                cellNum = sheet.getRow(0).getPhysicalNumberOfCells();
                strArray = new String[rows][cellNum];
            }
            // 遍历行
            for (int i = 0; i < rows; i++) {
                HSSFRow row = sheet.getRow(i);
                if (row != null) {
                    // 遍历列
                    for (int j = 0; j < cellNum; j++) {
                        // 获取到列的值
                        HSSFCell cell = row.getCell(j);
                        if (cell != null) {
                            switch (cell.getCellType()) {
                            case HSSFCell.CELL_TYPE_NUMERIC:
                                strArray[i][j] = cell.getNumericCellValue() + "";
                                break;
                            case HSSFCell.CELL_TYPE_STRING:
                                strArray[i][j] = cell.getStringCellValue();
                                break;
                            case HSSFCell.CELL_TYPE_FORMULA:
                                strArray[i][j] = cell.getNumericCellValue() + "";
                                break;
                            case HSSFCell.CELL_TYPE_BLANK:
                                strArray[i][j] = "";
                                break;
                            case HSSFCell.CELL_TYPE_BOOLEAN:
                                strArray[i][j] = cell.getBooleanCellValue() + "";
                                break;
                            default:
                                strArray[i][j] = null;
                                break;
                            }
                        }
                    }
                }
            }
            return strArray;
        } finally {
            if (null != fileInputStream) {
                fileInputStream.close();
            }
        }
    }

    /**
     * 读取Excel转为二维数组
     * 
     * @param filePath
     * @return
     * @throws IOException
     * @throws FileNotFoundException
     */
    public static String[][] getStrArrayByExcelFilePath(String filePath) throws FileNotFoundException, IOException {
        File file = new File(filePath);
        String[][] strArray = getStrArrayByExcelFile(file);
        return strArray;
    }

    public static void main(String[] args) throws FileNotFoundException, IOException {
        // 演示1
        String[] title = { "姓名", "密码" };
        List<String[]> values = new ArrayList<String[]>();
        values.add(new String[] { "zhangjian", "123456" });
        values.add(new String[] { "lisi", "654321" });
        createExcel(new FileOutputStream("D:/测试1.xls"), title, values);
        // ------------------------------------------------------------------
        // 演示2
        List<Map<String, String>> list = new ArrayList<Map<String, String>>();
        Map<String, String> m1 = new HashMap<String, String>();
        m1.put("账号", "zhangjian");
        m1.put("密码", "123456");
        Map<String, String> m2 = new HashMap<String, String>();
        m2.put("账号", "lisi");
        m2.put("密码", "654321");
        list.add(m1);
        list.add(m2);
        createExcel(new FileOutputStream("D:/测试2.xls"), list);
        // ------------------------------------------------------------------
        // 演示3
        String[] title3 = { "账号", "密码" };
        String[] key3 = { "code", "pwd" };
        List<Map<String, String>> values3 = new ArrayList<Map<String, String>>();
        Map<String, String> v1 = new HashMap<String, String>();
        v1.put("code", "zhangjian");
        v1.put("pwd", "123456");
        Map<String, String> v2 = new HashMap<String, String>();
        v2.put("code", "lisi");
        v2.put("pwd", "654321");
        values3.add(v1);
        values3.add(v2);
        createExcel(new FileOutputStream("D:/测试3.xls"), title3, key3, values3);

        // 读取测试1
        List<Map<String, String>> list4 = getMapListByExcelFilePath("D:/1.xls");
        System.out.println(list4.get(0));

        // 读取测试2
        String[][] strArray = getStrArrayByExcelFilePath("D:/1.xls");
        for (String[] strings : strArray) {
            for (String string : strings) {
                System.out.print(String.format("%5s", string) + "\t");
            }
            System.out.println("");
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档