XSSExcelUtil
package com.numa.util;
import org.apache.poi.hssf.usermodel.*;import org.apache.poi.hssf.util.HSSFColor;import org.apache.poi.ss.util.CellRangeAddress;import org.apache.poi.xssf.usermodel.*;
import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletResponse;import java.io.*;import java.net.InetAddress;import java.util.List;import java.util.Map;
/** * @Company:wftdlx * @Author: wjf * @Description: 一次性插入 XSSFWorkbook 存在溢出 * @Date: Created in 14:47 2018/12/13 */public class ExcelUtil {
public static XSSFWorkbook createWb() { XSSFWorkbook wb = new XSSFWorkbook();
return wb; }
public static void createSheet(XSSFWorkbook wb, String sheetx, String[] listTitle, List<Map<Integer, String>> list) throws Exception { //整体 XSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 水平居中 cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER); // 垂直居中
//第一行 XSSFCellStyle titleCellStyle = wb.createCellStyle(); XSSFFont font = wb.createFont(); font.setColor(HSSFColor.GREEN.index); titleCellStyle.setFont(font); titleCellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 水平居中 titleCellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER); // 垂直居中
XSSFSheet sheet = wb.createSheet(sheetx); //冻结首行 sheet.createFreezePane(0, 1, 0, 1); //sheet.createFreezePane(1, 1, 1, 1);//
XSSFRow row0 = sheet.createRow(0);
//listSize 总列数 标题列=正文列 int listSize = listTitle.length; //输入标题栏 for (int j = 0; j < listSize; j++) {// 5列 XSSFCell cell = row0.createCell((short) j); cell.setCellValue(listTitle[j].toString()); cell.setCellStyle(titleCellStyle); } CellRangeAddress region = new CellRangeAddress(0, 0, 10, 13); sheet.addMergedRegion(region); //rowSize总行数 不加标题 int rowSize = list.size(); // 从第二行输入 或者说输入数据的第一行 先创建再放值 for (int i = 0; i < rowSize; i++) { // 几行 总体大循环 //String[] listRow = list.get(i); //一行数据 Map<Integer, String> map = list.get(i); XSSFRow row = sheet.createRow(i + 1);//创建同一个序列号的第一行 for (int p = 0; p < map.size(); p++) { XSSFCell cell = row.createCell(p); cell.setCellValue(map.get(p));//填充数值 包含合并列 后面在合并 cell.setCellStyle(cellStyle); } //=========================前 前17列合并 int j = 0;//相同行 String serial = map.get(0); for (int k = i + 1; k < rowSize; k++) {//查前17列重 Map<Integer, String> _map = list.get(k); String _serial = _map.get(0); if (serial.equals(_serial)) { j++; } else { break; } } if (j > 0) { for (int p = 0; p < 17; p++) { CellRangeAddress cra = new CellRangeAddress(i + 1, i + j + 1, p, p); sheet.addMergedRegion(cra);//合并 }
} //===========================中 创建中间段 17--到倒数1列 for (int k = 0; k < j; k++) { Map<Integer, String> _map1 = list.get(i + 1 + k); XSSFRow _row = sheet.createRow(i + 1 + k + 1);//创建行 for (int p = 17; p < _map1.size() - 1; p++) { XSSFCell cell = _row.createCell(p); cell.setCellValue(_map1.get(p)); cell.setCellStyle(cellStyle); } } //===========================后 最后一行的合并 if (j > 0) { CellRangeAddress cra = new CellRangeAddress(i + 1, i + j + 1, map.size() - 1, map.size() - 1); sheet.addMergedRegion(cra);//合并 } i += j; } setSheet(sheet, listSize); }
// 自适应宽度(中文支持) 注意输入完成输入内容后起作用 size单元格总列数 private static void setSheet(XSSFSheet sheet, int size) { for (int columnNum = 0; columnNum < size; columnNum++) { int columnWidth = sheet.getColumnWidth(columnNum) / 256; for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) { XSSFRow currentRow; //当前行未被使用过 if (sheet.getRow(rowNum) == null) { currentRow = sheet.createRow(rowNum); } else { currentRow = sheet.getRow(rowNum); }
if (currentRow.getCell(columnNum) != null) { XSSFCell currentCell = currentRow.getCell(columnNum); if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) { int length = currentCell.getStringCellValue().getBytes().length; if (columnWidth < length) { columnWidth = length; } } } } sheet.setColumnWidth(columnNum, columnWidth * 256); } }
//主动设置单元格宽度 /* public static void setSheet(XSSFSheet sheet) {//
sheet.setColumnWidth(0, 256 * 34 + 184);//列宽 sheet.setColumnWidth(2, 256 * 19 + 184);//列宽 sheet.setColumnWidth(5, 256 * 25 + 184);//列宽 sheet.setColumnWidth(6, 256 * 19 + 184);//列宽 sheet.setColumnWidth(7, 256 * 16 + 184);//列宽 sheet.setColumnWidth(13, 256 * 40 + 184);//列宽 sheet.setColumnWidth(17, 256 * 12 + 184);//列宽 sheet.setColumnWidth(18, 256 * 18 + 184);//列宽*//* }*/
//1.输出流到客户端 public static void outExcel(HttpServletResponse response, XSSFWorkbook wb, String excelName) throws IOException { ByteArrayOutputStream os = new ByteArrayOutputStream(); wb.write(os); byte[] content = os.toByteArray(); InputStream is = new ByteArrayInputStream(content); // 设置response参数,可以打开下载页面 response.reset(); response.setContentType("application/force-download;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + new String((excelName + ".xls").getBytes(), "iso-8859-1")); ServletOutputStream out = response.getOutputStream(); BufferedInputStream bis = null; BufferedOutputStream bos = null; try { bis = new BufferedInputStream(is); bos = new BufferedOutputStream(out); byte[] buff = new byte[2048]; int bytesRead; // Simple read/write loop. while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } } catch (Exception e) { // TODO: handle exception Log.error("输出到客户端异常" + e.getMessage()); } finally { if (bis != null) bis.close(); if (bos != null) bos.close(); } }
public static String outExcel4(XSSFWorkbook wb) throws Exception { String pathx = Url.getPath(); long l = System.currentTimeMillis(); String path = pathx + "\\files\\" + l + ".xlsx";
File file = new File(path); if (!file.exists()) {// 判断文件是否存在 if (file.createNewFile()) {// 创建目标文件 FileOutputStream fos = new FileOutputStream(file); wb.write(fos); fos.close(); } }
InetAddress localHostLANAddress = LocalIp.getLocalHostLANAddress(); String address=localHostLANAddress.getHostAddress(); String url = "http://"+address+":" + 9091 + "/files/" + l + ".xlsx";//本地运行项目 return url; }
}
XSSExcelUtil的更多相关文章
随机推荐
- 推荐算法 pd
from django.db import connection select_sql = 'select * from model' datas = pd.read_sql(select_sql, ...
- ElasticSearch 2 (1) - Getting Start
ElasticSearch 2.1.1 (1) - Getting Start Install & Up cd elasticsearch-2.1.1/bin ./elasticsearch ...
- uva-141-枚举
旋转过程的下标变化,画个2x2的表格,模拟就可以出来了 #include <string> #include<iostream> #include<map> #in ...
- tkinter简单打开网址 + 执行系统命令
from tkinter import * import webbrowser root = Tk() text = Text(root,width=30,height = 5) text.pack( ...
- elk之[logstash-input-file]插件使用详解
https://www.cnblogs.com/xing901022/p/4805586.html http://www.cnblogs.com/xing901022/p/4802822.html ...
- 37. sqlplus工具连接服务端或其他电脑的oracle方式
1. 方式1:IP:监听端口/实例ID,例如:192.168.0.1:1521/orcl 2.方式2:IP:监听端口/服务名,例如:192.168.0.1:1521/ORCL.168.0.1 查看服务 ...
- django 模板context的理解
context作为view与template之间的桥梁,理解它的工作原理对于djagno的模板工作机制至关重要. class ContextDict(dict):#上下文词典,由词典可以通过conte ...
- spring boot 整合redis --sea 方式1
application.properties # REDIS (RedisProperties) # Redis数据库索引(默认为0) spring.redis.database=0 # Redis服 ...
- CRC16-CCITT C语言代码
代码如下,使用空间换时间的方法 #define CRC16_CCITT_SEED 0xFFFF // 该位称为预置值,使用人工算法(长除法)时 需要将除数多项式先与该与职位 异或 ,才能得到最后的除数 ...
- Dubbo的优化 --- 开发时使用
开发时的三个优化: 1.开发者在本地开发的时候启动Dubbo比较麻烦,所以采用直接连接的配置: 2.开发者本地开发时会打断点调试,会超过Dubbo默认的超时时间1s,所以需要全局设置超时时间: 3.开 ...