java 导出excel poi_java poi导出Excel

由于ajax请求不能下载,故先利用ajax将请求数据提交到后台,存入redis,并返回一个uuid,然后在ajax请求成功之后用window.location.href进行下载。

另外因为需求原因,Excel列数和列title是动态的,所以利用反射创建工作簿。

HSSFWorkbook wb = CreateExcelByReflect.createWb(data);//创建工作簿

String fileName ="任务表" +new Date().getTime() +".xls";

OutputStream out =null;

try {

out = response.getOutputStream();

response.reset();

response.setHeader("Content-Disposition","attachment;filename="

.concat(String.valueOf(URLEncoder.encode(fileName,"UTF-8"))));

response.setContentType("application/ms-excel;charset=UTF-8");

wb.write(out);

out.flush();

out.close();

}catch (IOException e) {

e.printStackTrace();

}

public class CreateExcelByReflect {

private static HSSFSheetsheet;//表格对象

private static HSSFWorkbookwb;//工作簿

private static LinkedHashMapheader;//表头

//初始化

public static void init(String sheetName,JSONArray titleArr) {

wb =new HSSFWorkbook();

sheet =wb.createSheet(sheetName);

header =new LinkedHashMap();

for(Object title : titleArr){

JSONObject obj = (JSONObject) JSON.toJSON(title);

header.put(obj.getString("key"), obj.getString("title"));

}

}

/**

* 创建各列表头

*/

public static void createHeadRow(){

HSSFRow head =sheet.createRow(0);//创建表格第一行对象,为表头行

Iterator> headTitle =header.entrySet().iterator();//循环输出表头

for(int i=0;headTitle.hasNext();i++){

HSSFCell cell = head.createCell(i);

cell.setCellValue(headTitle.next().getValue());

}

}

/**

* 创建数据行

*/

public static void createRows(List data){

int rowCount = data.size();//根据数据集设置行数

for(int i=0;i

HSSFRow row =sheet.createRow(i+1);//创建行,表头是第0行

//转换数据,将每一个DO映射为属性名与FieldsEntity的Map

Map map = DataConvertUtil.convertObjectToMap(data.get(i));

Iterator> head =header.entrySet().iterator();

//创建每行的单元格并填充值

for(int col =0;col

HSSFCell cell = row.createCell(col);

//设置表头的迭代器

Map.Entry enty = (Map.Entry)head.next();

String name = enty.getKey();

Object value = map.get(name);

if(null != value){

cell.setCellValue(map.get(name).getValue().toString());//填充属性值

}

}

}

}

public static HSSFWorkbook createWb(String sheetName,JSONArray titleArr, List data){

init(sheetName, titleArr);

createHeadRow();

createRows(data);

return wb;

}

}

public class DataConvertUtil {

/**

* 将对象的属性名称与值映射为MAP

* @param o 对象

* @return Mapkey为属性名称,value为名称、类型和值组成的对象

*/

public static Map convertObjectToMap(Object o){

Class oClass = o.getClass();

// Field[] fields = oClass.getDeclaredFields(); //获取类中的所有声明的属性

Field[] fields =getBeanFields(oClass, oClass.getDeclaredFields());

Map map =new HashMap();

try{

for(int i=0;i

// 不对序列化ID进行映射

if(fields[i].getName().equals("serialVersionUID")){

continue;

}

Object valueObject =getFieldValue(o,fields[i].getName());

map.put(fields[i].getName(),new FieldsEntity(fields[i].getName(), valueObject, fields[i].getType()));

}

return map;

}catch(Exception e){

e.printStackTrace();

}

return map;

}

public static Field[] getBeanFields(Class cls,Field[] fs){

fs = (Field[]) ArrayUtils.addAll(fs, cls.getDeclaredFields());

if(cls.getSuperclass()!=null){

Class clsSup = cls.getSuperclass();

fs =getBeanFields(clsSup,fs);

}

return fs;

}

/**

* 通过对象的getter方法获取属性值

* @param o 对象

* @param name 属性名称

* @return 相应属性的值

*/

public static Object getFieldValue(Object o,String name)throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InvocationTargetException {

Class owner = o.getClass();

Method mothed = owner.getMethod(createGetter(name));

Object object = mothed.invoke(o);

return object;

}

/**

* 通过属性名称拼凑getter方法

* @param fieldName

* @return

*/

public static String createGetter(String fieldName){

if(fieldName ==null || fieldName.length() ==0 ){

return null;

}

StringBuffer sb =new StringBuffer("get");

sb.append(fieldName.substring(0,1).toUpperCase()).append(fieldName.substring(1));

return sb.toString();

}

}

public class FieldsEntity {

private StringattributeName;//属性变量名称

private Objectvalue;//属性变量值

private ClassclassType;//属性类型

public String getAttributeName() {

return attributeName;

}

public void setAttributeName(String attributeName) {

this.attributeName = attributeName;

}

public Object getValue() {

return value;

}

public void setValue(Object value) {

this.value = value;

}

public Class getClassType() {

return classType;

}

public void setClassType(Class classType) {

this.classType = classType;

}

public FieldsEntity(String fieldName, Object o, Class classType){

this.attributeName = fieldName;

this.value = o;

this.classType = classType;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,关于Java导出Excel并自动求和,可以使用POI这个Java库来实现。下面是一个简单的示例: 首先,需要在项目中引入POI的依赖: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> ``` 接下来,可以使用POI提供的API来创建Excel文件以及向其中添加数据和公式。以下是一个示例代码: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; public class ExcelExporter { public static void main(String[] args) throws IOException { // 创建工作簿 Workbook workbook = new XSSFWorkbook(); // 创建工作表 Sheet sheet = workbook.createSheet("Sheet1"); // 创建表头行 Row headerRow = sheet.createRow(0); // 创建表头单元格并设置值 headerRow.createCell(0).setCellValue("序号"); headerRow.createCell(1).setCellValue("名称"); headerRow.createCell(2).setCellValue("数量"); headerRow.createCell(3).setCellValue("单价"); headerRow.createCell(4).setCellValue("总价"); // 创建数据行并填充数据 for (int i = 1; i <= 10; i++) { Row dataRow = sheet.createRow(i); dataRow.createCell(0).setCellValue(i); dataRow.createCell(1).setCellValue("物品" + i); dataRow.createCell(2).setCellValue(i * 2); dataRow.createCell(3).setCellValue(i * 10); // 创建公式单元格并设置公式 Cell formulaCell = dataRow.createCell(4); formulaCell.setCellFormula("C" + (i + 1) + "*D" + (i + 1)); } // 创建合计行并设置公式 Row totalRow = sheet.createRow(11); totalRow.createCell(3).setCellValue("合计:"); Cell totalCell = totalRow.createCell(4); totalCell.setCellFormula("SUM(E2:E11)"); // 调整列宽 for (int i = 0; i < 5; i++) { sheet.autoSizeColumn(i); } // 保存文件 FileOutputStream outputStream = new FileOutputStream("example.xlsx"); workbook.write(outputStream); workbook.close(); } } ``` 这段代码会创建一个包含数据和合计的Excel文件,并使用公式自动计算总价和合计。其中,`Cell.setCellFormula()`方法可以设置单元格中的公式,`SUM()`函数可以对指定区域的单元格求和。最后,需要将文件保存到磁盘上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值