• 创建表头信息

表头信息用于自动生成表头结构及排序

public class ExcelHeader implements Comparable<ExcelHeader>{

/**

* excel的标题名称

*/

private String title;

/**

* 每一个标题的顺序

*/

private int order;

/**

* 说对应方法名称

*/

private String methodName;

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

public int getOrder() {

return order;

}

public void setOrder(int order) {

this.order = order;

}

public String getMethodName() {

return methodName;

}

public void setMethodName(String methodName) {

this.methodName = methodName;

}

public int compareTo(ExcelHeader o) {

return order>o.order?1:(order<o.order?-1:0);

}

public ExcelHeader(String title, int order, String methodName) {

super();

this.title = title;

this.order = order;

this.methodName = methodName;

}

}

  • 表头信息的Annotation

/**

* 用来在对象的get方法上加入的annotation,通过该annotation说明某个属性所对应的标题

* Created by 钟述林 393156105@qq.com on 2016/10/29 0:14.

*/

@Retention(RetentionPolicy.RUNTIME)

public @interface ExcelResources {

/**

* 属性的标题名称

* @return

*/

String title();

/**

* 在excel的顺序

* @return

*/

int order() default 9999;

}

  • 创建数据实体

public class WebDto {

//网站名称

private String name;

//网址

private String url;

//用户名

private String username;

//密码

private String password;

//日均访问量

private Integer readCount;

public WebDto(String name, String url, String username, String password, Integer readCount) {

this.name = name;

this.url = url;

this.username = username;

this.password = password;

this.readCount = readCount;

}

public WebDto() {}

@Override

public String toString() {

return "WebDto{" +

"name='" + name + '\'' +

", url='" + url + '\'' +

", username='" + username + '\'' +

", password='" + password + '\'' +

", readCount=" + readCount +

'}';

}

@ExcelResources(title="网站名称",order=1)

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@ExcelResources(title="网址",order=2)

public String getUrl() {

return url;

}

public void setUrl(String url) {

this.url = url;

}

@ExcelResources(title="用户名",order=3)

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

@ExcelResources(title="密码",order=4)

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

@ExcelResources(title="日均访问量",order=5)

public Integer getReadCount() {

return readCount;

}

public void setReadCount(Integer readCount) {

this.readCount = readCount;

}

}

注意:这里使用到了@ExcelResources来自动识别表头信息及序号

  • 获取模板文件的工具类

public class TemplateFileUtil {

public static FileInputStream getTemplates(String tempName) throws FileNotFoundException {

return new FileInputStream(ResourceUtils.getFile("classpath:excel-templates/"+tempName));

}

}

注意:从这里可以看出,所有的Excel模板文件都放在resources/excel-templates/目录下。

  • 模板工具类

通过此类可以自动复制表样式等功能

/**

* 该类实现了基于模板的导出

* 如果要导出序号,需要在excel中定义一个标识为sernums

* 如果要替换信息,需要传入一个Map,这个map中存储着要替换信息的值,在excel中通过#来开头

* 要从哪一行那一列开始替换需要定义一个标识为datas

* 如果要设定相应的样式,可以在该行使用styles完成设定,此时所有此行都使用该样式

* 如果使用defaultStyls作为表示,表示默认样式,如果没有defaultStyles使用datas行作为默认样式

* Created by 钟述林 393156105@qq.com on 2016/10/28 23:38.

*/

public class ExcelTemplate {

/**

* 数据行标识

*/

public final static String DATA_LINE = "datas";

/**

* 默认样式标识

*/

public final static String DEFAULT_STYLE = "defaultStyles";

/**

* 行样式标识

*/

public final static String STYLE = "styles";

/**

* 插入序号样式标识

*/

public final static String SER_NUM = "sernums";

private static ExcelTemplate et = new ExcelTemplate();

private Workbook wb;

private Sheet sheet;

/**

* 数据的初始化列数

*/

private int initColIndex;

/**

* 数据的初始化行数

*/

private int initRowIndex;

/**

* 当前列数

*/

private int curColIndex;

/**

* 当前行数

*/

private int curRowIndex;

/**

* 当前行对象

*/

private Row curRow;

/**

* 最后一行的数据

*/

private int lastRowIndex;

/**

* 默认样式

*/

private CellStyle defaultStyle;

/**

* 默认行高

*/

private float rowHeight;

/**

* 存储某一方所对于的样式

*/

private Map<Integer,CellStyle> styles;

/**

* 序号的列

*/

private int serColIndex;

private ExcelTemplate(){

}

public static ExcelTemplate getInstance() {

return et;

}

/**

* 从classpath路径下读取相应的模板文件

* @param path

* @return

*/

public ExcelTemplate readTemplateByClasspath(String path) {

try {

wb = new HSSFWorkbook(TemplateFileUtil.getTemplates(path));

initTemplate();

} catch (IOException e) {

e.printStackTrace();

throw new RuntimeException("读取模板不存在!请检查");

}

return this;

}

/**

* 将文件写到相应的路径下

* @param filepath

*/

public void writeToFile(String filepath) {

FileOutputStream fos = null;

try {

fos = new FileOutputStream(filepath);

wb.write(fos);

} catch (FileNotFoundException e) {

e.printStackTrace();

throw new RuntimeException("写入的文件不存在");

} catch (IOException e) {

e.printStackTrace();

throw new RuntimeException("写入数据失败:"+e.getMessage());

} finally {

try {

if(fos!=null) fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* 将文件写到某个输出流中

* @param os

*/

public void wirteToStream(OutputStream os) {

try {

wb.write(os);

} catch (IOException e) {

e.printStackTrace();

throw new RuntimeException("写入流失败:"+e.getMessage());

}

}

/**

* 从某个路径来读取模板

* @param path

* @return

*/

public ExcelTemplate readTemplateByPath(String path) {

try {

wb = new HSSFWorkbook(TemplateFileUtil.getTemplates(path));

initTemplate();

} catch (IOException e) {

e.printStackTrace();

throw new RuntimeException("读取模板不存在!请检查");

}

return this;

}

/**

* 创建相应的元素,基于String类型

* @param value

*/

public void createCell(String value) {

Cell c = curRow.createCell(curColIndex);

setCellStyle(c);

c.setCellValue(value);

curColIndex++;

}

public void createCell(int value) {

Cell c = curRow.createCell(curColIndex);

setCellStyle(c);

c.setCellValue((int)value);

curColIndex++;

}

public void createCell(Date value) {

Cell c = curRow.createCell(curColIndex);

setCellStyle(c);

c.setCellValue(value);

curColIndex++;

}

public void createCell(double value) {

Cell c = curRow.createCell(curColIndex);

setCellStyle(c);

c.setCellValue(value);

curColIndex++;

}

public void createCell(boolean value) {

Cell c = curRow.createCell(curColIndex);

setCellStyle(c);

c.setCellValue(value);

curColIndex++;

}

public void createCell(Calendar value) {

Cell c = curRow.createCell(curColIndex);

setCellStyle(c);

c.setCellValue(value);

curColIndex++;

}

public void createCell(BigInteger value) {

Cell c = curRow.createCell(curColIndex);

setCellStyle(c);

c.setCellValue(value==null?0:value.intValue());

curColIndex++;

}

/**

* 设置某个元素的样式

* @param c

*/

private void setCellStyle(Cell c) {

if(styles.containsKey(curColIndex)) {

c.setCellStyle(styles.get(curColIndex));

} else {

c.setCellStyle(defaultStyle);

}

}

/**

* 创建新行,在使用时只要添加完一行,需要调用该方法创建

*/

public void createNewRow() {

if(lastRowIndex>curRowIndex&&curRowIndex!=initRowIndex) {

sheet.shiftRows(curRowIndex, lastRowIndex, 1,true,true);

lastRowIndex++;

}

curRow = sheet.createRow(curRowIndex);

curRow.setHeightInPoints(rowHeight);

curRowIndex++;

curColIndex = initColIndex;

}

/**

* 插入序号,会自动找相应的序号标示的位置完成插入

*/

public void insertSer() {

int index = 1;

Row row = null;

Cell c = null;

for(int i=initRowIndex;i<curRowIndex;i++) {

row = sheet.getRow(i);

c = row.createCell(serColIndex);

setCellStyle(c);

c.setCellValue(index++);

}

}

/**

* 根据map替换相应的常量,通过Map中的值来替换#开头的值

* @param datas

*/

public void replaceFinalData(Map<String,String> datas) {

if(datas==null) return;

for(Row row:sheet) {

for(Cell c:row) {

//                if(c.getCellType()!=Cell.CELL_TYPE_STRING) continue;

String str = c.getStringCellValue().trim();

if(str.startsWith("#")) {

if(datas.containsKey(str.substring(1))) {

c.setCellValue(datas.get(str.substring(1)));

}

}

}

}

}

/**

* 基于Properties的替换,依然也是替换#开始的

* @param prop

*/

public void replaceFinalData(Properties prop) {

if(prop==null) return;

for(Row row:sheet) {

for(Cell c:row) {

//                if(c.getCellType()!=Cell.CELL_TYPE_STRING) continue;

String str = c.getStringCellValue().trim();

if(str.startsWith("#")) {

if(prop.containsKey(str.substring(1))) {

c.setCellValue(prop.getProperty(str.substring(1)));

}

}

}

}

}

private void initTemplate() {

sheet = wb.getSheetAt(0);

initConfigData();

lastRowIndex = sheet.getLastRowNum();

curRow = sheet.createRow(curRowIndex);

}

/**

* 初始化数据信息

*/

private void initConfigData() {

boolean findData = false;

boolean findSer = false;

for(Row row:sheet) {

if(findData) break;

for(Cell c:row) {

//                if(c.getCellType()!=Cell.CELL_TYPE_STRING) continue;

String str = c.getStringCellValue().trim();

if(str.equals(SER_NUM)) {

serColIndex = c.getColumnIndex();

findSer = true;

}

if(str.equals(DATA_LINE)) {

initColIndex = c.getColumnIndex();

initRowIndex = row.getRowNum();

curColIndex = initColIndex;

curRowIndex = initRowIndex;

findData = true;

defaultStyle = c.getCellStyle();

rowHeight = row.getHeightInPoints();

initStyles();

break;

}

}

}

if(!findSer) {

initSer();

}

}

/**

* 初始化序号位置

*/

private void initSer() {

for(Row row:sheet) {

for(Cell c:row) {

//                if(c.getCellType()!=Cell.CELL_TYPE_STRING) continue;

String str = c.getStringCellValue().trim();

if(str.equals(SER_NUM)) {

serColIndex = c.getColumnIndex();

}

}

}

}

/**

* 初始化样式信息

*/

private void initStyles() {

styles = new HashMap<Integer, CellStyle>();

for(Row row:sheet) {

for(Cell c:row) {

//                if(c.getCellType()!=Cell.CELL_TYPE_STRING) continue;

String str = c.getStringCellValue().trim();

if(str.equals(DEFAULT_STYLE)) {

defaultStyle = c.getCellStyle();

}

if(str.equals(STYLE)) {

styles.put(c.getColumnIndex(), c.getCellStyle());

}

}

}

}

}

  • 操作工具类

/**

* 该类实现了将一组对象转换为Excel表格,并且可以从Excel表格中读取到一组List对象中

* 该类利用了BeanUtils框架中的反射完成

* 使用该类的前提,在相应的实体对象上通过ExcelReources来完成相应的注解

* Created by 钟述林 393156105@qq.com on 2016/10/29 0:15.

*/

public class ExcelUtil {

private static ExcelUtil eu = new ExcelUtil();

private ExcelUtil(){}

public static ExcelUtil getInstance() {

return eu;

}

/**

* 处理对象转换为Excel

* @param template

* @param objs

* @param clz

* @param isClasspath

* @return

*/

private ExcelTemplate handlerObj2Excel (String template, List objs, Class clz, boolean isClasspath)  {

ExcelTemplate et = ExcelTemplate.getInstance();

try {

if(isClasspath) {

et.readTemplateByClasspath(template);

} else {

et.readTemplateByPath(template);

}

List<ExcelHeader> headers = getHeaderList(clz);

Collections.sort(headers);

//输出标题

et.createNewRow();

for(ExcelHeader eh:headers) {

et.createCell(eh.getTitle());

}

//输出值

for(Object obj:objs) {

et.createNewRow();

for(ExcelHeader eh:headers) {

//              Method m = clz.getDeclaredMethod(mn);

//              Object rel = m.invoke(obj);

et.createCell(BeanUtils.getProperty(obj,getMethodName(eh)));

}

}

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

}

return et;

}

/**

* 根据标题获取相应的方法名称

* @param eh

* @return

*/

private String getMethodName(ExcelHeader eh) {

String mn = eh.getMethodName().substring(3);

mn = mn.substring(0,1).toLowerCase()+mn.substring(1);

return mn;

}

/**

* 将对象转换为Excel并且导出,该方法是基于模板的导出,导出到流

* @param datas 模板中的替换的常量数据

* @param template 模板路径

* @param os 输出流

* @param objs 对象列表

* @param clz 对象的类型

* @param isClasspath 模板是否在classPath路径下

*/

public void exportObj2ExcelByTemplate(Map<String,String> datas, String template, OutputStream os, List objs, Class clz, boolean isClasspath) {

try {

ExcelTemplate et = handlerObj2Excel(template, objs, clz, isClasspath);

et.replaceFinalData(datas);

et.wirteToStream(os);

os.flush();

os.close();

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* 将对象转换为Excel并且导出,该方法是基于模板的导出,导出到一个具体的路径中

* @param datas 模板中的替换的常量数据

* @param template 模板路径

* @param outPath 输出路径

* @param objs 对象列表

* @param clz 对象的类型

* @param isClasspath 模板是否在classPath路径下

*/

public void exportObj2ExcelByTemplate(Map<String,String> datas,String template,String outPath,List objs,Class clz,boolean isClasspath) {

ExcelTemplate et = handlerObj2Excel(template, objs, clz, isClasspath);

et.replaceFinalData(datas);

et.writeToFile(outPath);

}

/**

* 将对象转换为Excel并且导出,该方法是基于模板的导出,导出到流,基于Properties作为常量数据

* @param prop 基于Properties的常量数据模型

* @param template 模板路径

* @param os 输出流

* @param objs 对象列表

* @param clz 对象的类型

* @param isClasspath 模板是否在classPath路径下

*/

public void exportObj2ExcelByTemplate(Properties prop, String template, OutputStream os, List objs, Class clz, boolean isClasspath) {

ExcelTemplate et = handlerObj2Excel(template, objs, clz, isClasspath);

et.replaceFinalData(prop);

et.wirteToStream(os);

}

/**

* 将对象转换为Excel并且导出,该方法是基于模板的导出,导出到一个具体的路径中,基于Properties作为常量数据

* @param prop 基于Properties的常量数据模型

* @param template 模板路径

* @param outPath 输出路径

* @param objs 对象列表

* @param clz 对象的类型

* @param isClasspath 模板是否在classPath路径下

*/

public void exportObj2ExcelByTemplate(Properties prop,String template,String outPath,List objs,Class clz,boolean isClasspath) {

ExcelTemplate et = handlerObj2Excel(template, objs, clz, isClasspath);

et.replaceFinalData(prop);

et.writeToFile(outPath);

}

private Workbook handleObj2Excel(List objs, Class clz) {

Workbook wb = new HSSFWorkbook();

try {

Sheet sheet = wb.createSheet();

Row r = sheet.createRow(0);

List<ExcelHeader> headers = getHeaderList(clz);

Collections.sort(headers);

//写标题

for(int i=0;i<headers.size();i++) {

r.createCell(i).setCellValue(headers.get(i).getTitle());

}

//写数据

Object obj = null;

for(int i=0;i<objs.size();i++) {

r = sheet.createRow(i+1);

obj = objs.get(i);

for(int j=0;j<headers.size();j++) {

r.createCell(j).setCellValue(BeanUtils.getProperty(obj, getMethodName(headers.get(j))));

}

}

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

}

return wb;

}

/**

* 导出对象到Excel,不是基于模板的,直接新建一个Excel完成导出,基于路径的导出

* @param outPath 导出路径

* @param objs 对象列表

* @param clz 对象类型

*/

public void exportObj2Excel(String outPath,List objs,Class clz) {

Workbook wb = handleObj2Excel(objs, clz);

FileOutputStream fos = null;

try {

fos = new FileOutputStream(outPath);

wb.write(fos);

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if(fos!=null) fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* 导出对象到Excel,不是基于模板的,直接新建一个Excel完成导出,基于流

* @param os 输出流

* @param objs 对象列表

* @param clz 对象类型

*/

public void exportObj2Excel(OutputStream os,List objs,Class clz) {

try {

Workbook wb = handleObj2Excel(objs, clz);

wb.write(os);

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* 从类路径读取相应的Excel文件到对象列表

* @param path 类路径下的path

* @param clz 对象类型

* @param readLine 开始行,注意是标题所在行

* @param tailLine 底部有多少行,在读入对象时,会减去这些行

* @return

*/

public List<Object> readExcel2ObjsByClasspath(String path,Class clz,int readLine,int tailLine) {

Workbook wb = null;

try {

wb = new HSSFWorkbook(TemplateFileUtil.getTemplates(path));

return handlerExcel2Objs(wb, clz, readLine,tailLine);

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

/**

* 从文件路径读取相应的Excel文件到对象列表

* @param path 文件路径下的path

* @param clz 对象类型

* @param readLine 开始行,注意是标题所在行

* @param tailLine 底部有多少行,在读入对象时,会减去这些行

* @return

*/

public List<Object> readExcel2ObjsByPath(String path,Class clz,int readLine,int tailLine) {

Workbook wb = null;

try {

wb = new HSSFWorkbook(TemplateFileUtil.getTemplates(path));

return handlerExcel2Objs(wb, clz, readLine,tailLine);

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

/**

* 从类路径读取相应的Excel文件到对象列表,标题行为0,没有尾行

* @param path 路径

* @param clz 类型

* @return 对象列表

*/

public List<Object> readExcel2ObjsByClasspath(String path,Class clz) {

return this.readExcel2ObjsByClasspath(path, clz, 0,0);

}

/**

* 从文件路径读取相应的Excel文件到对象列表,标题行为0,没有尾行

* @param path 路径

* @param clz 类型

* @return 对象列表

*/

public List<Object> readExcel2ObjsByPath(String path,Class clz) {

return this.readExcel2ObjsByPath(path, clz,0,0);

}

private String getCellValue(Cell c) {

String o = null;

switch (c.getCellType()) {

case Cell.CELL_TYPE_BLANK:

o = ""; break;

case Cell.CELL_TYPE_BOOLEAN:

o = String.valueOf(c.getBooleanCellValue()); break;

case Cell.CELL_TYPE_FORMULA:

o = String.valueOf(c.getCellFormula()); break;

case Cell.CELL_TYPE_NUMERIC:

o = String.valueOf(c.getNumericCellValue()); break;

case Cell.CELL_TYPE_STRING:

o = c.getStringCellValue(); break;

default:

o = null;

break;

}

return o;

}

private List<Object> handlerExcel2Objs(Workbook wb,Class clz,int readLine,int tailLine) {

Sheet sheet = wb.getSheetAt(0);

List<Object> objs = null;

try {

Row row = sheet.getRow(readLine);

objs = new ArrayList<Object>();

Map<Integer,String> maps = getHeaderMap(row, clz);

if(maps==null||maps.size()<=0) throw new RuntimeException("要读取的Excel的格式不正确,检查是否设定了合适的行");

for(int i=readLine+1;i<=sheet.getLastRowNum()-tailLine;i++) {

row = sheet.getRow(i);

Object obj = clz.newInstance();

for(Cell c:row) {

int ci = c.getColumnIndex();

String mn = maps.get(ci).substring(3);

mn = mn.substring(0,1).toLowerCase()+mn.substring(1);

BeanUtils.copyProperty(obj,mn, this.getCellValue(c));

}

objs.add(obj);

}

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

return objs;

}

private List<ExcelHeader> getHeaderList(Class clz) {

List<ExcelHeader> headers = new ArrayList<ExcelHeader>();

Method[] ms = clz.getDeclaredMethods();

for(Method m:ms) {

String mn = m.getName();

if(mn.startsWith("get")) {

if(m.isAnnotationPresent(ExcelResources.class)) {

ExcelResources er = m.getAnnotation(ExcelResources.class);

headers.add(new ExcelHeader(er.title(),er.order(),mn));

}

}

}

return headers;

}

private Map<Integer,String> getHeaderMap(Row titleRow,Class clz) {

List<ExcelHeader> headers = getHeaderList(clz);

Map<Integer,String> maps = new HashMap<Integer, String>();

for(Cell c:titleRow) {

String title = c.getStringCellValue();

for(ExcelHeader eh:headers) {

if(eh.getTitle().equals(title.trim())) {

maps.put(c.getColumnIndex(), eh.getMethodName().replace("get","set"));

break;

}

}

}

return maps;

}

}

  • Excel模板文件

创建一个模板文件,如下图:

  • 测试类

@SpringBootTest

@RunWith(SpringRunner.class)

public class ExportExcelTest {

@Test

public void test() throws Exception {

List<WebDto> list = new ArrayList<WebDto>();

list.add(new WebDto("知识林", "http://www.zslin.com", "admin", "111111", 555));

list.add(new WebDto("权限系统", "http://basic.zslin.com", "admin", "111111", 111));

list.add(new WebDto("校园网", "http://school.zslin.com", "admin", "222222", 333));

Map<String, String> map = new HashMap<String, String>();

map.put("title", "网站信息表");

map.put("total", list.size()+" 条");

map.put("date", getDate());

ExcelUtil.getInstance().exportObj2ExcelByTemplate(map, "web-info-template.xls", new FileOutputStream("D:/temp/out.xls"),

list, WebDto.class, true);

}

private String getDate() {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");

return sdf.format(new Date());

}

}

执行测试方法后,查看D:/temp/out.xls文件后可以看到如下图的内容:

使用POI导出Excel文件的更多相关文章

  1. java POI导出Excel文件数据库的数据

    在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.这里我简单实现导出Excel文件. POI jar ...

  2. POI导出excel文件样式

    需求: 公司业务和银行挂钩,各种形式的数据之间交互性比较强,这就涉及到了存储形式之间的转换 比如数据库数据与excel文件之间的转换 解决: 我目前使用过的是POI转换数据库和文件之间的数据,下边上代 ...

  3. 简单的poi导出excel文件

    /**** 创建excel文件**/ 1 import java.io.FileOutputStream; import java.io.IOException; import java.util.C ...

  4. poi导出excel文件(桃)

    1.基本可以通用的工具类 package com.idcsol.apps.common.excel; import java.io.IOException; import java.io.Output ...

  5. java poi 导出Excel文件

    1,导包  poi-3.9-XXX.JAR 2, 创建一个实体对象 public class Student implements Serializable { /** * */ private st ...

  6. POI导出大量数据的简单解决方案(附源码)-Java-POI导出大量数据,导出Excel文件,压缩ZIP(转载自iteye.com)

    说明:我的电脑 2.0CPU 2G内存 能够十秒钟导出 20W 条数据 ,12.8M的excel内容压缩后2.68M 我们知道在POI导出Excel时,数据量大了,很容易导致内存溢出.由于Excel ...

  7. POI导出Excel和InputStream存储为文件

    POI导出Excel和InputStream存储为文件   本文需要说明的两个问题 InputStream如何保存到某个文件夹下 POI生成Excel POI操作utils类 代码如下.主要步骤如下: ...

  8. java使用POI操作excel文件,实现批量导出,和导入

    一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...

  9. Java POI导出Excel不弹框选择下载路径(下载文件不选择下载路径,默认) Chrome

    在Chrome浏览器中,Java导出Excel文件时,浏览器弹出提示框,需要选择下载路径 在Chrome中的高级设置中,把“下载前询问每个文件的保存位置”去掉就解决了 DEEPLOVE(LC)

随机推荐

  1. springboot restful接口服务异常处理

    一.spring boot中默认的错误处理机制 二.自定义的异常处理

  2. Spring Boot 启动(一) SpringApplication 分析

    Spring Boot 启动(一) SpringApplication 分析 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html ...

  3. python 根据字符串内数字排序

    当我们使用python给一个由字符串组成的列表排序时,常常会排成这样 [‘10a’, ‘11b’, ‘1c’, ‘20d’, ‘21e’, ‘2f’] 这样的形式 ,然而我们想要 [ ‘1c’,‘2f ...

  4. caoni大业 spring boot 跳坑记

    IDEA环境 win10 跑得刚刚,到xp系统就戈壁 报错 Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.g ...

  5. Android 软件管理工具类Utils

    Android 软件管理工具类Utils /** * Created by uilubo on 2015/9/30. * 工具类 */ public class Utils { public stat ...

  6. poj3130 (半平面交

    题意:判断是否存在内核. 半平面交存板子. /* gyt Live up to every day */ #include<cstdio> #include<cmath> #i ...

  7. Postman入门使用

    Postman 是一个很强大的 API调试.Http请求的工具,方便易用,毋庸置疑. 1.Postman安装 a. 打开谷歌浏览器 b. 进入设置界面 c. 选择扩展程序 d. 选择chrome网上应 ...

  8. TensorFlow 运行模型--会话(Session)

    会话模式一: 需要明确调用会话生成函数和关闭函数 # 创建一个会话 sess = tf.Session() # 使用创建好的会话进行运算 sess.run("要运算的对象") # ...

  9. HDMI SCDC处理过程

    SCDC       State and Control Data Channel 接收端如果有SCDC,应该在E-EDID中包含一个有效的HF-VSDB,并且把SCDC_Present位设置为1.在 ...

  10. python中global和nonlocal用法的详细说明

    一.global 1.global关键字用来在函数或其他局部作用域中使用全局变量.但是如果不修改全局变量也可以不使用global关键字.   gcount = 0 def global_test(): ...