• 创建表头信息

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

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. 每10秒执行定时任务-crontab

    * * * * * /data/crontab.sh * * * * * sleep 10; /data/crontab.sh * * * * * sleep 20; /data/crontab.sh ...

  2. c#关于Mysql MySqlBulkLoader 批量上传

    有个list表有几万数据 用insert插入,速度跟蜗牛爬行, 几十个表,传起来可就需要时间了. 搜搜,发现有  MySqlBulkLoader  这个人家mysql 的dll 里边已经提供了这个方法 ...

  3. Hadoop格式化namenode 出错 Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/security/authorize/Refr

    一般是修改配置文件:etc/hadoop/hadoop-env.sh的时候出现的错误 export JAVA_HOME=/usr/jdk export HADOOP_COMMON_HOME=~/had ...

  4. calendar模块

    calendar模块是个日历模块 1  判断是否是闰年 #!/urs/bin/evn python # -*- coding:utf-8 -*- import calendar print(calen ...

  5. 巧克力分配问题——C语言

    某品牌巧克力使用500克原料可制作55小块巧克力,请编程实现:输入原料重量(以千克为单位),计算出制作巧克力的块数(四舍五入).然后对这些巧克力进行分包,小盒放11块,大盒放24块,问各分装多少大盒多 ...

  6. 除了Office和wps,还有什么办公软件比较好用?

    一.不能没有的pdf软件 以下介绍的是PDF(Portable Document Format)常用的阅读.编撰以及其他工具.阅读工具1.Adobe AcrobatReader中文版应用平台:Wind ...

  7. Alpha 冲刺 (8/10)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 多次测试软件运行 学习OPENMP ...

  8. 数据库-mysql语句-查-WEB服务器

    (1)MySQL中的查询 (2)WEB服务器 Order:  订单.排序 Set:设置.集合 Table:表.桌子 1.MySQL中的简单查询 —— 查询结果的排序 示例:查询出所有员工信息,要求按工 ...

  9. JavaScript:event loop详解

    之前已经有两篇随笔提到了event loop,一篇是事件机制,一篇是tasks和microtasks,但是里面的event loop都是文字描述,很难说细,逻辑也只是简单的提了一遍.其实之前也是通过阮 ...

  10. windows 函数

    数组清零 ::ZeroMemory(首地址,大小);