读取excel工具utils
import org.apache.commons.fileupload.FileItem; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import com.hz.common.excel.Excel2003Reader; import com.hz.common.excel.Excel2007Reader; import com.hz.common.excel.IRowReader; import java.io.FileInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.List; public final class ExcelReaderUtil { private ExcelReaderUtil() { } private static final Logger logger = LogManager.getLogger(ExcelReaderUtil.class); // excel2003扩展名 public static final String EXCEL03_EXTENSION = ".xls"; // excel2007扩展名 public static final String EXCEL07_EXTENSION = ".xlsx"; /** * 读取Excel文件,可能是03也可能是07版本 * * @param reader * @param fileName * @throws Exception */ public static void readExcel(IRowReader reader, String fileName) throws Exception { // 处理excel2003文件 if (fileName.endsWith(EXCEL03_EXTENSION)) { Excel2003Reader excel03 = new Excel2003Reader(reader); excel03.process(fileName); // 处理excel2007文件 } else if (fileName.endsWith(EXCEL07_EXTENSION)) { Excel2007Reader excel07 = new Excel2007Reader(reader); excel07.process(fileName); } else { throw new Exception("文件格式错误,fileName的扩展名只能是xls或xlsx。"); } } /** * 读取Excel文件,可能是03也可能是07版本 * * @param reader * @param fileName * @param inputStream * @throws Exception */ public static void readExcel(IRowReader reader, String fileName, InputStream inputStream) throws Exception { // 处理excel2003文件 if (fileName.endsWith(EXCEL03_EXTENSION)) { Excel2003Reader excel03 = new Excel2003Reader(reader); excel03.process(inputStream); // 处理excel2007文件 } else if (fileName.endsWith(EXCEL07_EXTENSION)) { Excel2007Reader excel07 = new Excel2007Reader(reader); excel07.process(inputStream); } else { throw new Exception("文件格式错误,fileName的扩展名只能是xls或xlsx。"); } } /** * 获取Excel数据,返回List<String[]> * * @param sheetNumber * 读取工作表的下标(从1开始).可有可无,默认读取所有表单. */ public static final List<String[]> excelToArrayList(String filePath, int... sheetNumber) throws Exception { List<String[]> resultList = null; InputStream is = null; try { is = new FileInputStream(filePath); resultList = excelToArrayList(filePath, is, sheetNumber); } catch (Exception e) { throw e; } finally { if (is != null) { is.close(); } } return resultList; } /** * 获取Excel数据,返回List<String[]> * * @param sheetNumber * 读取工作表的下标(从1开始).可有可无,默认读取所有表单. */ public static final List<String[]> excelToArrayList(String fileName, FileItem fileItem, int... sheetNumber) throws Exception { List<String[]> resultList = null; InputStream is = null; try { is = fileItem.getInputStream(); resultList = excelToArrayList(fileName, is, sheetNumber); } catch (Exception e) { throw e; } finally { if (is != null) { is.close(); } } return resultList; } /** * 获取Excel数据,返回List<String[]>; * * @param sheetNumber * 读取工作表的下标(从1开始).可有可无,默认读取所有表单. */ public static final List<String[]> excelToArrayList(String fileName, InputStream is, final int... sheetNumber) throws Exception { final ArrayList<String[]> resultList = new ArrayList<String[]>(); try { readExcel(new IRowReader() { public void getRows(int sheetIndex, int curRow, List<String> rowlist) { if (sheetNumber == null) { resultList.add(rowlist.toArray(new String[] {})); } else { for (int k = 0; k < sheetNumber.length; k++) {// 循环工作表 if (sheetIndex == sheetNumber[k]) { resultList.add(rowlist.toArray(new String[] {})); } } } } }, fileName, is); } catch (Exception e) { logger.error("Read excel error.", e); throw e; } return resultList; } }
Excel 公共方法 utils
/** * Excel 公共方法 * */ public class ExcelUtil { public static List<Object> list = new ArrayList<Object>(); /** * 导出多个工作表(sheet)的excel Think.zf * * @param title * excel标题 * @param mapColumnNames * sheet映射数据列表,key:sheet名称 value:该工作表需要显示的列名 * 列名 * @param mapDataList * sheet映射数据列表,key:sheet名称 value:该工作表数据列表 * 显示数据 列明对应含有img的代表从服务端读取图片,之后请自行忽略img * @param response * @param request * @throws Exception */ public static void exportManySheet(String title, Map<String,String[]> mapColumnNames, Map<String,List<Map<String, Object>>> mapDataList, HttpServletResponse response, HttpServletRequest request) throws Exception { try { HSSFWorkbook workbook = new HSSFWorkbook(); // 创建工作簿对象 String sheetName = "";//工作表名称 String[] columnNames = {};//工作表数据列名 List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();//工作表数据信息 for (Map.Entry<String, String[]> entryColumnMap: mapColumnNames.entrySet()) { sheetName = entryColumnMap.getKey(); columnNames = entryColumnMap.getValue(); dataList = mapDataList.get(sheetName); HSSFSheet sheet = workbook.createSheet(sheetName); // 创建工作表 // 产生表格标题行 HSSFRow rowm = sheet.createRow(0); HSSFCell cellTiltle = rowm.createCell(0); // sheet样式定义【getColumnTopStyle()/getStyle()均为自定义方法 - 在下面 - 可扩展】 HSSFCellStyle columnTopStyle = getColumnTopStyle(workbook);// 获取列头样式对象 HSSFCellStyle style = getStyle(workbook); // 单元格样式对象 // 设置标题 sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (columnNames.length - 1))); cellTiltle.setCellStyle(columnTopStyle); cellTiltle.setCellValue(title); // 将每列的列名放进sheet中 int columnNum = insertColumnNames(columnNames, sheet, columnTopStyle); // 将数据放进sheet中 insertCellValue(dataList, request, workbook, sheet, style); // 让列宽随着导出的列长自动适应数据长度 formatExcelCellWdith(sheet, columnNum); } // 将数据信息workbook 导出excel文件 exportExcel(response, workbook); } catch (Exception e) { e.printStackTrace(); } } /** * 导出只有一个工作表(sheet)的excel Think.zf * * @param title * excel标题 * @param columnNames * 列明 * @param dataList * 显示数据 列明对应含有img的代表从服务端读取图片,之后请自行忽略img * @param response * @param request * @throws Exception */ public static void export(String title, String[] columnNames, List<Map<String, Object>> dataList, HttpServletResponse response, HttpServletRequest request) throws Exception { try { HSSFWorkbook workbook = new HSSFWorkbook(); // 创建工作簿对象 HSSFSheet sheet = workbook.createSheet(title); // 创建工作表 // 产生表格标题行 HSSFRow rowm = sheet.createRow(0); HSSFCell cellTiltle = rowm.createCell(0); // sheet样式定义【getColumnTopStyle()/getStyle()均为自定义方法 - 在下面 - 可扩展】 HSSFCellStyle columnTopStyle = getColumnTopStyle(workbook);// 获取列头样式对象 HSSFCellStyle style = getStyle(workbook); // 单元格样式对象 // 设置标题 sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (columnNames.length - 1))); cellTiltle.setCellStyle(columnTopStyle); cellTiltle.setCellValue(title); // 将每列的列名放进sheet中 int columnNum = insertColumnNames(columnNames, sheet, columnTopStyle); // 将数据放进sheet中 insertCellValue(dataList, request, workbook, sheet, style); // 让列宽随着导出的列长自动适应数据长度 formatExcelCellWdith(sheet, columnNum); // 将数据信息workbook 导出excel文件 exportExcel(response, workbook); } catch (Exception e) { e.printStackTrace(); } } /** * 插入展示列明 * * @param columnNames * @param sheet * @param columnTopStyle */ private static int insertColumnNames(String[] columnNames, HSSFSheet sheet, HSSFCellStyle columnTopStyle) { // 定义所需列数 int columnNum = columnNames.length; HSSFRow rowRowName = sheet.createRow(2); // 在索引2的位置创建行(最顶端的行开始的第二行) // 将列头设置到sheet的单元格中 for (int n = 0; n < columnNum; n++) { HSSFCell cellRowName = rowRowName.createCell(n); // 创建列头对应个数的单元格 cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); // 设置列头单元格的数据类型 HSSFRichTextString text = new HSSFRichTextString(columnNames[n]); cellRowName.setCellValue(text); // 设置列头单元格的值 cellRowName.setCellStyle(columnTopStyle); // 设置列头单元格样式 } return columnNum; } /** * 导出excel文件 Think.zf * * @param response * @param workbook * 2017-06-08 */ private static void exportExcel(HttpServletResponse response, HSSFWorkbook workbook) { if (workbook != null) { try { String fileName = "Excel-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls"; String headStr = "attachment; filename=\"" + fileName + "\""; response.setContentType("APPLICATION/OCTET-STREAM"); response.setHeader("Content-Disposition", headStr); ServletOutputStream out = response.getOutputStream(); workbook.write(out); } catch (Exception e) { e.printStackTrace(); } } } /** * 插入数据 * * @param dataList * 导出数据 * @param request * 主要获取web项目路径 * @param workbook * @param sheet * @param style * @throws Exception */ private static void insertCellValue(List<Map<String, Object>> dataList, HttpServletRequest request, HSSFWorkbook workbook, HSSFSheet sheet, HSSFCellStyle style) throws Exception { // 将查询出的数据设置到sheet对应的单元格中 HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); for (int i = 0; i < dataList.size(); i++) { Map<String, Object> rowMap = dataList.get(i);// 遍历每个对象 HSSFRow row = sheet.createRow(i + 3);// 创建所需的行数 row.setHeight((short) 2000);// 设置150行高度 sheet.setColumnWidth(0, 16*256);//设置第一列的宽度 //sheet.setColumnWidth(1, 20*256);//设置第二列的宽度 int j = 0; int rowNum = row.getRowNum(); for (Map.Entry<String, Object> entry : rowMap.entrySet()) { HSSFCell cell = null; // 设置单元格的数据类型 if (entry.getKey().trim().indexOf("img") != -1) { // 图片 String imgFilePath = entry.getValue().toString();// 服务端图片地址 String serverBasePath = request.getSession().getServletContext().getRealPath("/");// 获取服务端上下文路径 byte[] imgOutputStreamBytes = null;//图片输出流 String _filePath = (new StringBuilder().append(imgFilePath)).toString(); if(_filePath.indexOf("https") != -1){ //包含https得,用https获取文件流 imgOutputStreamBytes = ImageUtil.getOutputStreamByHttpsImgUrl(_filePath); }else{ //一般网络路径地址,这个路径没有http,需要添加http if(_filePath.indexOf("http")!=-1){ imgOutputStreamBytes = ImageUtil.getOutputStreamByHttpImgUrl(_filePath); }else{ imgOutputStreamBytes = ImageUtil.getOutputStreamByHttpImgUrl(String.format("%s%s", Constants.IMG_PRE,_filePath)); } } // URL urlfile = new URL(_filePath); //读取远程服务器图片 // File imgFile = new File(_filePath);//读取本地图片 cell = row.createCell(j, HSSFCell.CELL_TYPE_STRING); cell.setCellValue("图片"); if(imgOutputStreamBytes != null) { //bufferImg = ImageIO.read(imgFile); // ImageIO.write(bufferImg, "png", byteArrayOut); HSSFClientAnchor anchor = new HSSFClientAnchor(10, 10, 0, 0, (short) (j), rowNum, (short) (j + 1), rowNum + 1); patriarch.createPicture(anchor, workbook.addPicture(imgOutputStreamBytes, HSSFWorkbook.PICTURE_TYPE_JPEG)); } } else { cell = row.createCell(j, HSSFCell.CELL_TYPE_STRING); if (null != entry.getValue()) cell.setCellValue(new HSSFRichTextString(entry.getValue().toString())); else cell.setCellValue(""); } cell.setCellStyle(style); j++; } } } private static Boolean urlFileIsExsits(URL urlfile) throws IOException { Boolean isExists; HttpURLConnection urlcon2 = (HttpURLConnection) urlfile.openConnection(); String message = urlcon2.getHeaderField(0); if (!message.startsWith("HTTP/1.1 404")) { isExists = true; }else{ isExists = false; } return isExists; } /** * 格式化excel列的宽度,自适应 * * @param sheet * @param columnNum */ private static void formatExcelCellWdith(HSSFSheet sheet, int columnNum) { for (int colNum = 0; colNum < columnNum; colNum++) { int columnWidth = sheet.getColumnWidth(colNum) / 256; for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) { HSSFRow currentRow; // 当前行未被使用过 if (sheet.getRow(rowNum) == null) { currentRow = sheet.createRow(rowNum); } else { currentRow = sheet.getRow(rowNum); } if (currentRow.getCell(colNum) != null) { HSSFCell currentCell = currentRow.getCell(colNum); if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) { String currentCellValue = currentCell.getStringCellValue();// 获取当前列的值 int length = 0; for (String cValue : currentCellValue.split("\r\n")) { if (length < cValue.getBytes().length) length = cValue.getBytes().length; } if (columnWidth < length) { columnWidth = length; } } } } if (colNum == 0) { sheet.setColumnWidth(colNum, (columnWidth - 2) * 256); } else { sheet.setColumnWidth(colNum, (columnWidth + 4) * 256); } } } /* * 列头单元格样式 */ private static HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) { // 设置字体 HSSFFont font = workbook.createFont(); // 设置字体大小 font.setFontHeightInPoints((short) 11); // 字体加粗 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 设置字体名字 font.setFontName("Courier New"); // 设置样式; HSSFCellStyle style = workbook.createCellStyle(); // 设置底边框; style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 设置底边框颜色; style.setBottomBorderColor(HSSFColor.BLACK.index); // 设置左边框; style.setBorderLeft(HSSFCellStyle.BORDER_THIN); // 设置左边框颜色; style.setLeftBorderColor(HSSFColor.BLACK.index); // 设置右边框; style.setBorderRight(HSSFCellStyle.BORDER_THIN); // 设置右边框颜色; style.setRightBorderColor(HSSFColor.BLACK.index); // 设置顶边框; style.setBorderTop(HSSFCellStyle.BORDER_THIN); // 设置顶边框颜色; style.setTopBorderColor(HSSFColor.BLACK.index); // 在样式用应用设置的字体; style.setFont(font); // 设置自动换行; style.setWrapText(false); // 设置水平对齐的样式为居中对齐; style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 设置垂直对齐的样式为居中对齐; style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); return style; } /* * 列数据信息单元格样式 */ private static HSSFCellStyle getStyle(HSSFWorkbook workbook) { // 设置字体 HSSFFont font = workbook.createFont(); // 设置字体大小 // font.setFontHeightInPoints((short)10); // 字体加粗 // font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 设置字体名字 font.setFontName("Courier New"); // 设置样式; HSSFCellStyle style = workbook.createCellStyle(); // 设置底边框; style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 设置底边框颜色; style.setBottomBorderColor(HSSFColor.BLACK.index); // 设置左边框; style.setBorderLeft(HSSFCellStyle.BORDER_THIN); // 设置左边框颜色; style.setLeftBorderColor(HSSFColor.BLACK.index); // 设置右边框; style.setBorderRight(HSSFCellStyle.BORDER_THIN); // 设置右边框颜色; style.setRightBorderColor(HSSFColor.BLACK.index); // 设置顶边框; style.setBorderTop(HSSFCellStyle.BORDER_THIN); // 设置顶边框颜色; style.setTopBorderColor(HSSFColor.BLACK.index); // 在样式用应用设置的字体; style.setFont(font); // 设置水平对齐的样式为居中对齐; style.setAlignment(HSSFCellStyle.ALIGN_LEFT); // 设置垂直对齐的样式为居中对齐; style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 使用\r\n 可换行 style.setWrapText(true); return style; } }