java通过模板导出excel的一个实例

12 篇文章 1 订阅
11 篇文章 1 订阅

写之前,大家请先下好poi的相关jar包,网上遍地都是,不多说

<input type="button" id="exportBtn" class="CommonBtn" value="导出Excel" />  这个是按钮

这个是相关事件

// 导出按钮
$('#exportBtn').click(function(){
txtBeginDate = $('#txtBeginDate').datebox('getValue');
txtEndDate = $('#txtEndDate').datebox('getValue');
window.location.href='${CTX_ROOT}/TBoilerrunlogController?method=getExcelByBoiler&begin='+txtBeginDate+'&end='+txtEndDate+'';
});  //我是转向spring mvc的controllor里面了,我这里还给传了俩个值,一个是开始时间,一个是结束时间


controllor代码如下:

@RequestMapping(params = "method=getExcelByBoiler")
@ResponseBody
public String getExcelByBoiler(HttpServletRequest request,
HttpServletResponse response) {
String begin="";
String end="";
if(request.getParameter("begin")!=null && request.getParameter("end") !=null){
begin=request.getParameter("begin");
end = request.getParameter("end");
}

try {
String path =request.getServletContext().getRealPath("")
+ "/excelTemplate/统计.xls";   //这个是我的excel模板
InputStream in = new FileInputStream(new File(path));
SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //为了转时间
HSSFWorkbook work = new HSSFWorkbook(in);
// 得到excel的第0张表
HSSFSheet sheet = work.getSheetAt(0);
// 得到第1行的第一个单元格的样式
HSSFRow rowCellStyle = sheet.getRow(2);
HSSFCellStyle columnOne = rowCellStyle.getCell(0).getCellStyle();
HSSFCellStyle columnOne1 = rowCellStyle.getCell(1).getCellStyle();
HSSFCellStyle columnOne2 = rowCellStyle.getCell(4).getCellStyle();
// 这里面的行和列的数法与计算机里的一样,从0开始是第一
// 填充title数据

HSSFRow row = sheet.getRow(0);
HSSFCell cell = row.getCell(2);
cell.setCellValue("一号机组启停统计(" + begin + "~" + end + ")");
int i = 2;// 计数器
List<Map<String, Object>> list = this.getBoilerRunlog("GL1",begin,end);
// 创建每个单元格,添加样式,最后合并
work.getSheetAt(0).shiftRows(3, 3, list.size() - 1); // 把第三行移动到列表的长度-1的地方  这个地方我是要把模板的第四行放到最后一行
int numberbegin = 0;// 统计
int numberend = 0;// 统计
for (Map map : list) {
row = sheet.createRow(i);// 得到行
cell = row.createCell(0);// 得到第0个单元格
if (!(map.get("actiondatetime") == null)) {
cell.setCellValue(simpleFormat.format(map.get("actiondatetime")));
} else {
cell.setCellValue("");
}
cell.setCellStyle(columnOne);// 填充样式


cell = row.createCell(1);
if (!(map.get("actionstatus") == null)) {
cell.setCellValue(map.get("actionstatus").toString());
} else {
cell.setCellValue("");
}
cell.setCellStyle(columnOne1);// 填充样式
cell = row.createCell(2);
if (!(map.get("logmemo") == null)) {
cell.setCellValue(map.get("logmemo").toString());
} else {
cell.setCellValue("");
}
cell.setCellStyle(columnOne1);// 填充样式
cell = row.createCell(3);
if (!(map.get("rundays") == null)) {
cell.setCellValue(map.get("rundays").toString());
numberbegin++;
} else {
cell.setCellValue("");
}
cell.setCellStyle(columnOne1);// 填充样式
cell = row.createCell(4);
if (!(map.get("stophours") == null)) {
cell.setCellValue(map.get("stophours").toString());
numberend++;
} else {
cell.setCellValue("");
}
cell.setCellStyle(columnOne2);// 填充样式
// .....给每个单元格填充数据和样式
i++;
}
HSSFRow row1 = sheet.getRow(list.size() + 2);
HSSFCell cell1 = row1.getCell(0);
cell1.setCellValue("启停共" + (numberbegin+numberend) + "次," +  "其中启" + numberbegin
+ "次,停" + numberend + "次");//
/*******************************sheet二*******************************************/
HSSFSheet sheet1 = work.getSheetAt(1);
// 得到第1行的第一个单元格的样式
HSSFRow rowCellStyle1 = sheet1.getRow(2);
HSSFCellStyle columnOne01 = rowCellStyle1.getCell(0).getCellStyle();
HSSFCellStyle columnOne02 = rowCellStyle1.getCell(1).getCellStyle();
HSSFCellStyle columnOne03 = rowCellStyle1.getCell(4).getCellStyle();
HSSFRow row2 = sheet1.getRow(0);
HSSFCell cell2 = row2.getCell(2);
cell2.setCellValue("二号机组启停统计(" + begin + "~" + end + ")");
int j = 2;// 计数器
List<Map<String, Object>> list2 = this.getBoilerRunlog("GL2",begin,end);
// 创建每个单元格,添加样式,最后合并
work.getSheetAt(1).shiftRows(3, 3, list2.size() - 1); // 把第三行移动到列表的长度-1的地方
int numberbegin1 = 0;// 统计
int numberend1 = 0;// 统计
for (Map map : list2) {
row2 = sheet1.createRow(j);// 得到行
cell2 = row2.createCell(0);// 得到第0个单元格
if (!(map.get("actiondatetime") == null)) {
cell2.setCellValue(simpleFormat.format(map.get("actiondatetime")));
} else {
cell2.setCellValue("");
}
cell2.setCellStyle(columnOne01);// 填充样式
cell2 = row2.createCell(1);
if (!(map.get("actionstatus") == null)) {
cell2.setCellValue(map.get("actionstatus").toString());
} else {
cell2.setCellValue("");
}
cell2.setCellStyle(columnOne02);// 填充样式
cell2 = row2.createCell(2);
if (!(map.get("logmemo") == null)) {
cell2.setCellValue(map.get("logmemo").toString());
} else {
cell2.setCellValue("");
}
cell2.setCellStyle(columnOne02);// 填充样式
cell2 = row2.createCell(3);
if (!(map.get("rundays") == null)) {
cell2.setCellValue(map.get("rundays").toString());
numberbegin1++;
} else {
cell2.setCellValue("");
}
cell2.setCellStyle(columnOne02);// 填充样式
cell2 = row2.createCell(4);
if (!(map.get("stophours") == null)) {
cell2.setCellValue(map.get("stophours").toString());
numberend1++;
} else {
cell2.setCellValue("");
}
cell2.setCellStyle(columnOne03);// 填充样式
// .....给每个单元格填充数据和样式
i++;
}
HSSFRow row3 = sheet1.getRow(list2.size() + 2);
HSSFCell cell3 = row3.getCell(0);
cell3.setCellValue("启停共" + (numberbegin1+numberend1) + "次," +  "其中启" + numberbegin1
+ "次,停" + numberend1 + "次");//


/****************************输出流*****************************************/
String address = simpleFormat.format(new Date());
OutputStream os = response.getOutputStream();// 取得输出流
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition",
"attachment;filename=jzqttj_"+address+".xls");
work.write(os);
os.close();
} catch (FileNotFoundException e) {
System.out.println("文件路径错误");
e.printStackTrace();
} catch (IOException e) {
System.out.println("文件输入流错误");
e.printStackTrace();
}
return null;
}


这个大概思路就是,我把提前写好的excel模板的要遍历的那一行每个cell(单元格)的样式复制出来,然后在接下来的每行每个cell都给赋予相关的样式

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
根据excel模板动态导出数据库数据 package text; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import javax.servlet.ServletContext; import net.sf.jxls.transformer.XLSTransformer; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class TextAction extends ActionSupport { /** */ private static final long serialVersionUID = 1L; private String filename; @SuppressWarnings("rawtypes") public String export() throws Exception { String templateFile = "18.xls"; // String sql = "select * from t_ry order by rybm"; // exportAndDownload(templateFile, DataBase.retrieve(sql)); List datas = new ArrayList(); @SuppressWarnings("unchecked") HashMap map = new HashMap(); map.put("name", "1111"); datas.add(map); exportAndDownload(templateFile, datas); return SUCCESS; } @SuppressWarnings({ "rawtypes", "unchecked" }) public void exportAndDownload(String templateFile, List datas) { try { filename = UUID.randomUUID() + templateFile; // FacesContext context = FacesContext.getCurrentInstance(); // ServletContext servletContext = (ServletContext) // context.getExternalContext().getContext(); ServletContext servletContext = ServletActionContext .getServletContext(); String path = servletContext.getRealPath("\\ExcelFile"); String srcFilePath = path + "\\template\\" + templateFile; String destFilePath = path + "\\download\\" + filename; Map beanParams = new HashMap(); beanParams.put("results", datas); XLSTransformer transfer = new XLSTransformer(); transfer.transformXLS(srcFilePath, beanParams, destFilePath); // Browser.execClientScript("window.location.href='../ExcelFile/downloadfile.jsp?filename=" // + destFile + "';"); } catch (Exception e) { e.printStackTrace(); } } public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } }
Java通过模板导出Excel可以使用Apache POI和Jxls两种方式。 1. Apache POI Apache POI是一个用于读写Microsoft Office格式文件的Java库。通过POI,可以使用Java代码读取、创建和修改Excel文件、Word文档和PowerPoint演示文稿等Microsoft Office格式文件。 使用POI导出Excel需要先创建Excel模板,然后在Java代码中读取模板文件,根据数据填充模板,最后将填充后的数据写入新的Excel文件。 2. Jxls Jxls是一个用于将Java数据导出Excel、Word和PDF等格式文件的开源Java库。Jxls提供了一种基于Excel模板的数据填充方式,可以通过Java对象、Map或List等数据源填充Excel模板,并将填充后的数据写入新的Excel文件。 使用Jxls导出Excel需要先创建Excel模板,然后在Java代码中读取模板文件,根据数据填充模板,最后将填充后的数据写入新的Excel文件。 下面是使用Apache POI和Jxls两种方式导出Excel的示例代码: 1. 使用Apache POI导出Excel ```java // 导出Excel模板 public void exportExcelTemplate(String templateFilePath, String destFilePath) throws Exception { InputStream is = new FileInputStream(templateFilePath); Workbook workbook = WorkbookFactory.create(is); Sheet sheet = workbook.getSheetAt(0); // 在模板中填充数据 // ... OutputStream os = new FileOutputStream(destFilePath); workbook.write(os); os.close(); is.close(); } // 导出Excel数据 public void exportExcelData(String templateFilePath, String destFilePath, List<Map<String, Object>> dataList) throws Exception { InputStream is = new FileInputStream(templateFilePath); Workbook workbook = WorkbookFactory.create(is); Sheet sheet = workbook.getSheetAt(0); // 在模板中填充数据 for (int i = 0; i < dataList.size(); i++) { Row row = sheet.createRow(i + 1); Map<String, Object> data = dataList.get(i); row.createCell(0).setCellValue(data.get("name").toString()); row.createCell(1).setCellValue(data.get("age").toString()); // ... } OutputStream os = new FileOutputStream(destFilePath); workbook.write(os); os.close(); is.close(); } ``` 2. 使用Jxls导出Excel ```java // 导出Excel模板 public void exportExcelTemplate(String templateFilePath, String destFilePath) throws Exception { InputStream is = new FileInputStream(templateFilePath); OutputStream os = new FileOutputStream(destFilePath); Context context = new Context(); JxlsHelper.getInstance().processTemplate(is, os, context); os.close(); is.close(); } // 导出Excel数据 public void exportExcelData(String templateFilePath, String destFilePath, List<Map<String, Object>> dataList) throws Exception { InputStream is = new FileInputStream(templateFilePath); OutputStream os = new FileOutputStream(destFilePath); Context context = new Context(); context.putVar("dataList", dataList); JxlsHelper.getInstance().processTemplate(is, os, context); os.close(); is.close(); } ``` 以上是两种方式导出Excel的示例代码,其中使用Jxls导出Excel需要在项目中添加jxls和jxls-poi依赖。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值