JSP导出Excel
导出EXCEL的两个方法

导出EXCEL的两个⽅法⽅法⼀:/*** 导出参数模板设置,通过相似查找出来的数据*/private void handleExportToExcelByLikeQuery(Page page, HttpServletResponse response) {try {List<ExworkRecordExportVo> list = new ArrayList<>();List<ExworksRecord> exworksRecordList = page.getList();if (exworksRecordList != null) {for (ExworksRecord e : exworksRecordList) {ExworkRecordExportVo v = new ExworkRecordExportVo();v.setOrderNo(e.getOrderNo());v.setApplierNo(e.getApplierNo());v.setApplierName(e.getApplierName());v.setLeaderNo(e.getLeaderNo());v.setLeaderName(e.getLeaderName());v.setpInTime(e.getpInTime());v.setpOutTime(e.getpOutTime());switch (e.getStatus()) {case "1":v.setStatus("审核中");break;case "2":v.setStatus("已通过");break;case "3":v.setStatus("驳回");break;case "4":v.setStatus("废弃");break;default:v.setStatus("");break;}v.setRemark(e.getRemark());v.setFinishStatus("1".equals(e.getFinishStatus())?"未完成":"完成");v.setCreateTime(e.getCreateTime());list.add(v);}}ExportParams params = new ExportParams("申请列表", "申请列表", ExcelType.HSSF);Workbook workbook = ExcelExportUtil.exportExcel(params, ExworkRecordExportVo.class, list);SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode("申请列表--" + dateFormat.format(new Date()) + "" + ".xls", "UTF-8"));// 组装附件名称和格式 ServletOutputStream out = response.getOutputStream();workbook.write(out);out.flush();out.close();} catch (IOException e) {e.printStackTrace();}}主要⽤的三个jar包import org.jeecgframework.poi.excel.ExcelExportUtil;import org.jeecgframework.poi.excel.entity.ExportParams;import org.jeecgframework.poi.excel.entity.enmus.ExcelType;ExcelExportUtil.exportExcel(params, ExworkRecordExportVo.class, list);主要参数: 1:ExportParams 、2:实体类 ExworkRecordExportVo 3:实体类对应的list在封装⼀下excel的名字和其他参数即可⽅法⼆:public void exportConferenceEnrolChangeList(@RequestParam(required = true, value = "enrolId") Integer enrolId,@RequestParam(required = true, value = "accessToken") String accessToken, HttpServletResponse response) throws IOException {("*****调⽤ ConferenceEnrolChangeController 类 - exportConferenceEnrolChangeList ⽅法,参数:enrolId:" + enrolId + ", accessToken:" + accessToken);Assert.assertNotEmpty(accessToken, "accessToken");Assert.assertIntNotEmpty(enrolId, "enrolId");response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode("报名名单配置变更记录.xls", "UTF-8"));// 第⼀步,创建⼀个webbook,对应⼀个Excel⽂件HSSFWorkbook wb = new HSSFWorkbook();// 第⼆步,在webbook中添加⼀个sheet,对应Excel⽂件中的sheetHSSFSheet sheet = wb.createSheet("变更记录");// 第三步,在sheet中添加表头第0⾏,注意⽼版本poi对Excel的⾏数列数有限制shortHSSFRow row = sheet.createRow((int) 0);// 第四步,创建单元格,并设置值表头设置表头居中HSSFCellStyle style = wb.createCellStyle();style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建⼀个居中格式HSSFCell cell = row.createCell((short) 0);cell.setCellValue("操作⼈");cell.setCellStyle(style);cell = row.createCell((short) 1);cell.setCellValue("mip");cell.setCellStyle(style);cell = row.createCell((short) 2);cell.setCellValue("单位");cell.setCellStyle(style);cell = row.createCell((short) 3);cell.setCellValue("部门");cell.setCellStyle(style);cell = row.createCell((short) 4);cell.setCellValue("变更操作");cell.setCellStyle(style);cell = row.createCell((short) 5);cell.setCellValue("变更内容");cell.setCellStyle(style);cell = row.createCell((short) 6);cell.setCellValue("变更原因");cell.setCellStyle(style);// 第五步,写⼊实体数据 service查询数据库得到的listList<ConferenceEnrolChangeRecord> list = conferenceEnrolChangeService.getConferenceEnrolChangeListForExport(enrolId); for (int i = 0; i < list.size(); i++) {row = sheet.createRow(i + 1);ConferenceEnrolChangeRecord record = list.get(i);// 第六步,创建单元格,并设置值row.createCell((short) 0).setCellValue(record.getOperationName());row.createCell((short) 1).setCellValue(record.getMipNo());row.createCell((short) 2).setCellValue(record.getCompany());row.createCell((short) 3).setCellValue(record.getDepartment());row.createCell((short) 4).setCellValue(record.getChangeOperation());row.createCell((short) 5).setCellValue(record.getChangeContent());row.createCell((short) 6).setCellValue(record.getChangeReason());}try {ServletOutputStream out = response.getOutputStream();wb.write(out);out.flush();out.close();} catch (Exception e) {e.printStackTrace();}}是⼀个接接⼝调⽤⽅法,创建步骤很明确,⼀步⼀步操作即可;。
SpringBoot中使用JeecgBoot的Autopoi导出Excel的方法步骤

SpringBoot中使⽤JeecgBoot的Autopoi导出Excel的⽅法步骤说到导出 Excel,我们⾸先会想到 poi、jsxl 等,使⽤这些⼯具会显得笨重,学习难度⼤。
今天学习使⽤ JeecgBoot 中的Autopoi 导出 Excel,底层基于 easypoi,使⽤简单,还⽀持数据字典⽅式⼀、开发前戏1、引⼊ maven 依赖<!-- AutoPoi Excel⼯具类--><dependency><groupId>org.jeecgframework</groupId><artifactId>autopoi-web</artifactId><version>1.1.1</version><exclusions><exclusion><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId></exclusion></exclusions></dependency>exclusions 是将 commons-codec 从 autopoi 中排除,避免冲突2、切换 Jeecg 镜像以下代码放在 pom.xml ⽂件中的 parent 标签下⾯<repositories><repository><id>aliyun</id><name>aliyun Repository</name><url>/nexus/content/groups/public</url><snapshots><enabled>false</enabled></snapshots></repository><repository><id>jeecg</id><name>jeecg Repository</name><url>/nexus/content/repositories/jeecg</url><snapshots><enabled>false</enabled></snapshots></repository></repositories>可以看到,这⾥我们配置了 aliyun 的国内镜像,还配置了 jeecg 的镜像,这样⽅便我们下载依赖⽂件3、导出⼯具类我们把导出 Excel 通⽤⽅法写在 ExcelUtils.java ⽂件中import org.jeecgframework.poi.excel.def.NormalExcelConstants;import org.jeecgframework.poi.excel.entity.ExportParams;import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;import org.springframework.web.servlet.ModelAndView;import java.util.List;/*** 导出excel⼯具类** @author lizhou*/public class ExcelUtils {/*** 导出excel** @param title ⽂件标题* @param clazz 实体类型* @param exportList 导出数据* @param <T>* @return*/public static <T> ModelAndView export(String title, Class<T> clazz, List<T> exportList) {ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());mv.addObject(NormalExcelConstants.FILE_NAME, title);mv.addObject(NormalExcelConstants.CLASS, clazz);mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title, title));mv.addObject(NormalExcelConstants.DATA_LIST, exportList);return mv;}}这样我们导出数据的时候,只需要传⼊⽂件的标题(标题同样作为表格的标题)、数据类型、数据集合,就可以导出数据了⼆、开始导出1、给实体类加注解我们将需要导出的实体类或 VO 类中的属性加上注解 @Excelpackage com.zyxx.sys.entity;import com.baomidou.mybatisplus.annotation.*;import com.baomidou.mybatisplus.extension.activerecord.Model;import mon.annotation.Dict;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;import lombok.Data;import lombok.EqualsAndHashCode;import lombok.experimental.Accessors;import org.jeecgframework.poi.excel.annotation.Excel;import java.io.Serializable;/*** <p>* ⽤户信息表* </p>** @author lizhou* @since 2020-07-06*/@Data@EqualsAndHashCode(callSuper = false)@Accessors(chain = true)@TableName("sys_user_info")@ApiModel(value = "SysUserInfo对象", description = "⽤户信息表")public class SysUserInfo extends Model<SysUserInfo> {@ApiModelProperty(value = "ID")@TableId(value = "id", type = IdType.AUTO)private Long id;@Excel(name = "账号", width = 15)@ApiModelProperty(value = "登录账号")@TableField("account")private String account;@ApiModelProperty(value = "登录密码")@TableField("password")private String password;@Excel(name = "姓名", width = 15)@ApiModelProperty(value = "姓名")@TableField("name")private String name;@Excel(name = "电话", width = 15)@ApiModelProperty(value = "电话")@TableField("phone")private String phone;@ApiModelProperty(value = "头像")@TableField("avatar")private String avatar;@Excel(name = "性别", width = 15)@ApiModelProperty(value = "性别(0--未知1--男2--⼥)")@TableField("sex")private Integer sex;@Excel(name = "状态", width = 15)@ApiModelProperty(value = "状态(0--正常1--冻结)")@TableField("status")private Integer status;@Excel(name = "创建时间", width = 30)@ApiModelProperty(value = "创建时间")@TableField("create_time")private String createTime;}@Excel(name = “性别”, width = 15)name:表头width:列宽度导出 Excel 时,只会导出加了 @Excel 注解的字段,不然不会导出2、导出数据@ApiOperation(value = "导出⽤户信息", notes = "导出⽤户信息")@GetMapping(value = "/export")public ModelAndView exportXls(SysUserInfo sysUserInfo) {return ExcelUtils.export("⽤户信息统计报表", SysUserInfo.class, sysUserInfoService.list(1, Integer.MAX_VALUE, sysUserInfo).getData());}我们传⼊了⽂件的标题,类型为 SysUserInfo,传⼊了数据的集合,这样我们请求这个 API 就能导出数据了可以看出数据已经成功导出,但是性别、状态这些属性值还属于魔法值,我们需要⾃⼰写 SQL 来翻译这些值,或者配合数据字典来翻译这些值三、配合数据字典导出上⾯介绍了数据的简单导出,下⾯介绍配合数据字典导出数据,如果对数据字典不熟悉的同学,可先看看我的另⼀篇博客:1、@Excel 注解与上⾯注解相⽐,我们需要多加⼀个属性,dicCode,如下@Excel(name = "性别", width = 15, dicCode = "sex")@ApiModelProperty(value = "性别(0--未知1--男2--⼥)")@TableField("sex")@Dict(dictCode = "sex")private Integer sex;@Excel(name = “性别”, width = 15, dicCode = “sex”)name:表头width:列宽度dicCode :字典类型这样,我们就为这个字段注⼊了⼀个字典类型,这样就能翻译成⽂本了2、配置类要配合数据字典导出,我们需要配置 autopoi 的配置类 AutoPoiConfig.javaimport org.jeecgframework.core.util.ApplicationContextUtil;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/*** autopoi 配置类** @Author Lizhou*/@Configurationpublic class AutoPoiConfig {/*** excel注解字典参数⽀持(导⼊导出字典值,⾃动翻译)* 举例: @Excel(name = "性别", width = 15, dicCode = "sex")* 1、导出的时候会根据字典配置,把值1,2翻译成:男、⼥;* 2、导⼊的时候,会把男、⼥翻译成1,2存进数据库;* @return*/@Beanpublic ApplicationContextUtil applicationContextUtil() {return new org.jeecgframework.core.util.ApplicationContextUtil();}}3、翻译规则我们可以根据⾃⼰项⽬中的字典翻译规则,来重写 autopoi 的字典翻译规则 AutoPoiDictService.java import com.zyxx.sys.entity.SysDictDetail;import com.zyxx.sys.mapper.SysDictDetailMapper;import lombok.extern.slf4j.Slf4j;import org.jeecgframework.dict.service.AutoPoiDictServiceI;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.ArrayList;import java.util.List;/*** 描述:AutoPoi Excel注解⽀持字典参数设置* 举例: @Excel(name = "性别", width = 15, dicCode = "sex")* 1、导出的时候会根据字典配置,把值1,2翻译成:男、⼥;* 2、导⼊的时候,会把男、⼥翻译成1,2存进数据库;** @Author lizhou*/@Slf4j@Servicepublic class AutoPoiDictService implements AutoPoiDictServiceI {@Autowiredprivate SysDictDetailMapper sysDictDetailMapper;/*** 通过字典翻译字典⽂本** @Author lizhou*/@Overridepublic String[] queryDict(String dicTable, String dicCode, String dicText) {List<String> dictReplaces = new ArrayList<>();List<SysDictDetail> dictList = sysDictDetailMapper.queryDictItemsByCode(dicCode);for (SysDictDetail t : dictList) {if (t != null) {dictReplaces.add(t.getName() + "_" + t.getCode());}}if (dictReplaces != null && dictReplaces.size() != 0) {return dictReplaces.toArray(new String[dictReplaces.size()]);}return null;}}实现了 AutoPoiDictServiceI 接⼝,重写 queryDict ⽅法,这⾥我只使⽤了 dicCode 来查询字典列表,这样就能配合数据字典导出了4、导出数据导出数据如图所⽰可以看出,数据已经成功导出,性别、状态等魔法值已经被翻译成⽂本,这样,我们的字典翻译是成功的四、总结以上介绍了 JeecgBoot 中的 Autopoi 导出 Excel 的⽅法,还有配合数据字典导出等操作,可以看出,⽐以往我们使⽤的 poi、jsxl 使⽤⽅便,导出⽅便,⼤⼤提⾼了我们的⼯作效率。
JS019.原生JS使用newBlob()实现带格式导出Word、Excel(提供无编程基。。。

JS019.原⽣JS使⽤newBlob()实现带格式导出Word、Excel(提供⽆编程基。
导出效果代码实现<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><table id="table" border="1"><tr style="height:50px;"><th style="width:100px;color:red;">姓名</th><th>性别</th><th>年龄</th></tr><tr><td>⼩明</td><td>男</td><td>16</td></tr><tr><td>⼩红</td><td>⼥</td><td>17</td></tr><tr><td>⼩张</td><td>男</td><td>17</td></tr></table><a id="down">点击下载excel</a><script>let html = `<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"></head><body>${document.getElementById('table').outerHTML}</body></html>`let blob = new Blob([html],{ type: 'application/vnd.ms-excel'});let a = document.getElementById('down');a.href = URL.createObjectURL(blob);a.download = '测试excel下载'</script></body></html>注意事项 · 只能写⾏内样式。
导出excel方法

导出excel方法导出Excel是一种非常常见的操作,它允许我们将数据以电子表格的形式保存,并可以进行进一步的处理和分析。
在这里,我将为您介绍三种常见的导出Excel 的方法。
方法一:使用开源库(如pandas)进行导出pandas是一个强大的数据分析库,可以用于处理和分析结构化数据。
它提供了一个非常方便的方法来导出数据到Excel文件。
下面是一个使用pandas库导出数据到Excel的示例代码:import pandas as pd# 创建一个数据集data = {'姓名': ['张三', '李四', '王五'],'年龄': [25, 30, 35],'性别': ['男', '女', '男']}df = pd.DataFrame(data)# 导出数据到Exceldf.to_excel('data.xlsx', index=False)在这个例子中,我们首先创建了一个包含姓名、年龄和性别的数据集。
然后,我们使用`to_excel()`方法将数据集导出到一个名为"data.xlsx"的Excel文件中。
参数`index=False`用于防止生成的Excel文件中包含索引列。
方法二:使用Python自带的csv模块进行导出Python自带了一个csv模块,可以用于操作逗号分隔值(CSV)格式的数据。
尽管CSV是一种常见的数据存储格式,但它也可以很容易地导出为Excel文件。
下面是一个使用csv模块导出数据到Excel的示例代码:import csv# 创建一个数据集data = [['姓名', '年龄', '性别'],['张三', 25, '男'],['李四', 30, '女'],['王五', 35, '男']]# 导出数据到Excelwith open('data.csv', 'w', newline='') as file:writer = csv.writer(file)writer.writerows(data)在这个例子中,我们首先创建了一个包含姓名、年龄和性别的数据集。
网页数据如何简单导出excel

网页数据如何简单导出excel在浏览网页时,遇到我们需要的网页数据时,如文字、图片等,如何能简单的导出到Excel 中,方便在本地电脑中查看和编辑呢?当然是有办法的啦!下面就为大家介绍几种简单快速的将网页数据导出到Excel的方法,大家可以灵活运用。
一、通过浏览器导出网页数据具体操作:打开某网页后,右键点击网页空白处,在下拉列表中选择“另存为”,然后在弹出的保存窗口中选择保存类型为“网页全部”。
选择保存位置后确定,保存后就会自动保存两个文件,一个是网址,另一个是保存网页内容元素。
如何导出网页数据,以赶集网采集为例图1二、通过网页数据采集器导出网页数据先通过网页数据采集器,将网页数据采集下来,然后再导出为需要的格式即可。
本文使用的是操作简单、功能强大的八爪鱼采集器。
以下是一个八爪鱼采集并导出网页数据的完整示例。
示例中采集的是赶集网上房产-商铺-深圳-南山分类下的所有商铺信息。
示例网站:/fang6/nanshan/步骤1:创建采集任务1)进入主界面,选择“自定义模式”如何导出网页数据,以赶集网采集为例图22)将要采集的网址URL,复制粘贴到网址输入框中,点击“保存网址”如何导出网页数据,以赶集网采集为例图3步骤2:创建翻页循环1)在页面右上角,打开“流程”,以展现出“流程设计器”和“定制当前操作”两个板块。
将页面下拉到底部,点击“下一页”按钮,在右侧的操作提示框中,选择“循环点击下一页”如何导出网页数据,以赶集网采集为例图4步骤3:创建列表循环1)移动鼠标,选中页面里的第一个商铺链接。
选中后,系统会自动识别页面里的其他相似链接。
在右侧操作提示框中,选择“选中全部”如何导出网页数据,以赶集网采集为例图52)选择“循环点击每个链接”,以创建一个列表循环如何导出网页数据,以赶集网采集为例图6步骤4:提取商铺信息1)在创建列表循环后,系统会自动点击第一个商铺链接,进入商铺详细信息页。
点击需要的字段信息,在右侧的操作提示框中,选择“采集该元素的文本”如何导出网页数据,以赶集网采集为例图72)字段信息选择完成后,选中相应的字段,可以进行字段的自定义命名。
JXLS将数据库取得的数据根据Excel模板导出

} 4、套用模板
/** * @category 将查询结果集根据模板导出Excel文档 * @category ${results.rybm} 模板数据项定义:取结果集的rybm字段
*
* @param templateFile
*
模板文件(全部存放在ExcelFile\template目录)
* @param datas
燕飞出品
5、模板文件格式 6、运行效果
燕飞出品
第(4)页,共(4)页
1、需要的 JAR 包
2、下载文件目录
3、准备数据
@Action(id = "export") public void export() throws Exception
{
String templateFile = "18.xls";
String sql = "select * from t_ry order by rybm"; exportAndDownload(templateFile, DataBase.retrieve(sql));
jxls将数据库取得的数据根据excel模板导出jxls导出exceljxlsexceljxls生成exceljxls模板数据库导出excelexcel数据库模板sql数据库导出exceljava数据库导出excelmysql数据库导出excel
燕飞出品
JXLS 将数据库取得的数据根据 Excel 模板导出
*
导出的数据
*/
第(1)页,共(4)页
燕飞出品
public void exportAndDownload(String templateFile, List<HashMap> datas) {
java实现导出Excel(跨行,跨列)

java实现导出Excel(跨⾏,跨列)先来个最终结果样式:第⼀步:传参,后期可根据⾃⼰需要进⾏调整。
我这⾥需要的是quarter 代表季度dptid 部门编号根据接受过来的参数进⾏⽂档命名。
UserInfo userInfo=(UserInfo)request.getSession().getAttribute("userInfo");String userid=userInfo.getUserID();String quarter = request.getParameter("quarter");String dptid = request.getParameter("dptid");/***********************EXCEL导出部分**************************/String str3 = FileInfoTools.getSystemFilePath()+ "/documentTemp/";File file = new File(str3);if (!file.exists() && !file.isDirectory()) {file.mkdir();}String names = new SimpleDateFormat("yyyyMMddhhmmssSSS").format(new Date());String ourl = str3 + names + "_"+userid+".xls";FileOutputStream fos = null;String fileName = "";try {HSSFWorkbook wb = new HSSFWorkbook();//创建⼯作薄fileName = "安全可控导出"+"_"+userid+"_"+names+".xls";DBManager dbm = new DBManager();System.out.println("quarter+"+quarter+"dptid="+dptid);try{dbm.newConnection();String str = "select departmentname from dpt_department where departmentid='"+dptid+"'"; //获取唯⼀idString dptName = dbm.executeQueryString(str);fileName=dptName+"部门安全可控清单汇总"+"_"+userid+"_"+names+".xls";//创建sheet页,并写⼊内容createSheet(dbm,wb,getCardInfo(dbm,quarter,dptid));}catch(Exception e){e.printStackTrace();}finally{dbm.closeConnection();}File ff = new File(ourl);if (ff.exists()) {ff.delete();}fos = new FileOutputStream(ourl);wb.write(fos);fos.close();String u = "/project/system/fileAction.do?filePath=" + URLEncoder.encode(ourl)+ "&fileName=" + URLEncoder.encode(fileName);response.sendRedirect(u);} catch (Exception e) {e.printStackTrace();}第⼆步:创建sheet页签public void createSheet(DBManager dbm,HSSFWorkbook w,Vector vt) throws Exception{for(int i=0;i<vt.size();i++){Hashtable ht = (Hashtable)vt.get(i);String id = (String)ht.get("id");String quarter = (String)ht.get("quarter");HSSFSheet sheet = w.createSheet("安全可控清单");//写⼊数据wirteSheet(dbm,sheet,w,id,quarter);}}我这⾥页签是固定的名称可根据⾃⼰的需要根据参数来进⾏判断页签。
关于Java中excel表格导出的总结(Java程序导出模板和Java根据模板导出表格两种。。。

关于Java中excel表格导出的总结(Java程序导出模板和Java根据模板导出表格两种。
导出excel通⽤模板(程序定义模板导出)转载原⽂:如下代码,本⽅法主要⽤于程序定义模板格式,并导出⽂件。
该⽅法将定义和创建分离,达到了⼀定解耦合,降低了开发复杂度。
但是依然是程序定义模板,对模板的样式需要程序控制,没有达到将数据和样式分离的⽬的。
改良版,关于添加依赖之类的之前⼀篇⽂章⾥⾯有。
这篇是把之前的⽅法抽成通⽤模板。
⼀、添加⼀个实体类package com.lencity.securitymanagementplatform.data.entity;import java.util.List;public class XlsData {public static final int DATA_TYPE_INTEGER = 0;public static final int DATA_TYPE_STRING = 1;private List<String> titles;//表头private List<Integer> types;//数据类型private List<List<Object>> values;存表数据public List<Integer> getTypes() {return types;}public void setTypes(List<Integer> types) {this.types = types;}public List<String> getTitles() {return titles;}public void setTitles(List<String> titles) {this.titles = titles;}public List<List<Object>> getValues() {return values;}public void setValues(List<List<Object>> values) {this.values = values;}}⼆、创建⼀个service类package com.lencity.securitymanagementplatform.service;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.OutputStream;import java.io.UnsupportedEncodingException;import .URLEncoder;import java.util.List;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFDataFormat;import ermodel.HSSFFont;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import ermodel.HorizontalAlignment;import org.springframework.stereotype.Service;import com.lencity.securitymanagementplatform.data.entity.XlsData;@Servicepublic class XlsService {//写⼀个接⼝,哪个控制器需要加上导出excel功能就继承这个接⼝public static interface IXlsOutputProcessor {public XlsData processXlsData(Map<String, Object> condition);}//解析数据创建excelpublic HSSFWorkbook createExcelData(IXlsOutputProcessor processor, Map<String, Object> condition) {XlsData xlsData = processor.processXlsData(condition);HSSFWorkbook workbook = new HSSFWorkbook();HSSFSheet sheet = workbook.createSheet("统计表");// 创建⼀个excel表单HSSFRow titleRow = sheet.createRow(0);// 设置列宽,setColumnWidth的第⼆个参数要乘以256,这个参数的单位是1/256个字符宽度sheet.setColumnWidth(1, 15 * 256);sheet.setColumnWidth(3, 20 * 256);HSSFCellStyle style = workbook.createCellStyle();style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));// 设置⽇期格式HSSFFont font = workbook.createFont();// 设置为居中加粗font.setBold(true);style.setAlignment(HorizontalAlignment.CENTER);style.setFont(font);List<String> titles = xlsData.getTitles();HSSFCell cell;/* 构造表头 */for (int i = 0; i < titles.size(); i++) {cell = titleRow.createCell(i);cell.setCellValue(titles.get(i));cell.setCellStyle(style);}int rowNum = 1;List<Integer> dataTypes = xlsData.getTypes();List<List<Object>> values = xlsData.getValues();for (int i = 0; i < values.size(); i++) {List<Object> value = values.get(i);HSSFRow row = sheet.createRow(rowNum);for (int j = 0; j < value.size(); j++) {switch (dataTypes.get(j)) {case XlsData.DATA_TYPE_INTEGER:row.createCell(j).setCellValue((Integer) value.get(j));break;case XlsData.DATA_TYPE_STRING:row.createCell(j).setCellValue((String) value.get(j));break;}}rowNum++;}return workbook;}// 浏览器导出excelpublic void buildExcelDocument(String filename, HSSFWorkbook workbook, HttpServletResponse response)throws Exception {response.reset();response.setContentType("application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "utf-8")); OutputStream outputStream = response.getOutputStream();workbook.write(outputStream);outputStream.flush();outputStream.close();}// 下载excel模板功能public void downloadTemplate(HttpServletResponse response,HttpServletRequest request) throws Exception {String fileName="导出模板.xls";response.reset();response.setContentType("application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8")); String filePath=request.getServletContext().getRealPath("/excel/")+fileName;FileInputStream input=new FileInputStream(filePath);OutputStream out=response.getOutputStream();byte[] b=new byte[2048];int len;while((len=input.read(b))!=-1) {out.write(b,0,len);}response.setHeader("Content-Length", String.valueOf(input.getChannel().size()));input.close();}}三、控制器假设我们要在⽤户页⾯加上导出表格的功能,那就在⽤户的控制器上继承接⼝public class UserController implements IXlsOutputProcessor {继承之后需要在控制器中重写接⼝⽅法,导出的表格样式.png关于封装数据,主要就是根据⾃⼰实际的项⽬需求,来构造数据了// 封装数据@Overridepublic XlsData processXlsData(Map<String, Object> condition) {List<String> titles = new ArrayList<>();//表头List<Integer> dataTypes = new ArrayList<>();//表数据类型List<List<Object>> values = new ArrayList<>();//表头对应的数据titles.add("姓名");dataTypes.add(XlsData.DATA_TYPE_STRING);titles.add("⼿机号码");dataTypes.add(XlsData.DATA_TYPE_STRING);titles.add("职位");dataTypes.add(XlsData.DATA_TYPE_STRING);titles.add("部门");dataTypes.add(XlsData.DATA_TYPE_STRING);List<User> users = userService.getUsersByCondition(condition);XlsData xlsData = new XlsData();xlsData.setTitles(titles);xlsData.setTypes(dataTypes);for (User user : users) {List<Object> tmpList = new ArrayList<>();tmpList.add(user.getName());tmpList.add(user.getMobile());tmpList.add(user.getPosition());tmpList.add(departmentService.getDepartmentNameByDepartmentCode(user.getDepartmentCode()));values.add(tmpList);}xlsData.setValues(values);return xlsData;}// 导出excel,前台js,点击导出excel 关联的路径就是这个@PostMapping(value = "/downLoadXls")@ResponseBodypublic String downLoadXls(Map<String, Object> condition, HttpServletResponse response) throws Exception { String fileName = "导出excel.xls";HSSFWorkbook workbook = xlsService.createExcelData(this, condition);xlsService.buildExcelDocument(fileName, workbook, response);JSONObject jsonObject = new JSONObject();jsonObject.put("code", 1);return jsonObject.toString();}// 下载模板,前台js,点击下载模板关联的路径就是这个@PostMapping(value = "/downloadTemplate")@ResponseBodypublic String downloadTemplate(HttpServletResponse response,HttpServletRequest request) throws Exception { String fileName = "导出excel.xls";xlsService.downloadTemplate(response, request);JSONObject jsonObject = new JSONObject();jsonObject.put("code", 1);return jsonObject.toString();}前台界⾯.png模板的存放位置前台按钮代码<button type="button" class="btn btn-primary waves-effect" onclick="downloadTemplate()" id="downloadTemplate"><i class="material-icons">vertical_align_bottom</i><span>下载模板</span></button><button type="button" class="btn btn-primary waves-effect"onclick="exportExcel()"><i class="material-icons">vertical_align_bottom</i><span>导出表格</span></button>jsform表单⾥⾯是页⾯的表单筛选条件,如果要导数据库所有的数据,可把form表单去掉。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用JSP操作Excel第一种方法:静态方法生成Word和Excel文档要使JSP网页以Word或Excel格式打开,只需要利用Page指令的contentType属性。
ContentType设置ContentType报头,标明即将发送到客户端程序的文档的MIME类型。
浏览器根据这个MIME类型,以相应的方式打开网页。
JSP默认的MIME类型是text/html,这时经普通HTML的方式呈现网页内容。
要将网页以Work或Excel方式打开,则要告诉浏览器MIME类型为Word或Excel。
Word页面需要在JSP文件头设置如下指令。
<%@ page contentType=”application/msword;charset=GBK”%>Excel页面需要在JSP文件头设置如下指令<%@ page contentType=”application/vnd.ms-excel;charset=GBK”%>第二种方法:如何使用POI组件操作Excel可以通过设置响头ContentType达到以Excel文档形式输出的目的。
POI组件介绍Apache的Jakata项目POI,就可以用来操作Excel,并满足大部分需要。
POI下面几个子项目,其中HSSF项目就上用来实现Excel的读写的。
下面是HSSF的主页:/poi/hssf/index.html.POI组件可以到下载,下载后,将jar包所有的位置加入工程的lib目录中或将jar包所有的位置加入到classpath,或者将其解压的jar包拷到Tomcat目录的common\lib目录最新的下载地址:/(1)创建连接数据库的JavaBean的文件DBConnection.javapackage myBean;import java.sql.*;public class DBConnection {String sDBDriver="com.microsoft.jdbc.sqlserver.SQLServerDriver";StringsConnStr="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=JspSamples";//String sDBDriver="sun.jdbc.odbc.JdbcOdbcDriver";//String sConnStr="jdbc:odbc:JspSamples";public DBConnection(){try{Class.forName(sDBDriver);}catch(ClassNotFoundException e){System.out.println("DBConnection()"+e.getMessage());}}public ResultSet execQuery(String sql){ResultSet rs=null;try{Connection conn=DriverManager.getConnection(sConnStr,"sa","sa");Statement stmt=conn.createStatement();rs=stmt.executeQuery(sql);}catch(SQLException ex){System.out.println("DBConnection.execQuery()"+ex.getMessage());}return rs;}}(2)下面的操作Excel的类会取出的前面数据库里面的所有数据,然后逐条写到Excel文件中。
类的文件名POIExcel.javapackage myBean;import ermodel.*;import java.io.*;import java.sql.*;import myBean.DBConnection;public class POIExcel {private DBConnection con;public POIExcel() {con=new DBConnection();}//@SuppressWarnings("deprecation")@SuppressWarnings("deprecation")public void exportExcel(String name,OutputStream out){HSSFWorkbook wb=new HSSFWorkbook();HSSFSheet sheet=wb.createSheet(name);HSSFRow row=sheet.createRow(0);HSSFCell cell=row.createCell((short)0);cell.setEncoding(HSSFCell.ENCODING_UTF_16);cell.setCellValue("姓名");cell=row.createCell((short)1);cell.setEncoding(HSSFCell.ENCODING_UTF_16);cell.setCellValue("电子邮件");String sql="select name,email from db_user";int nRow=1;try{ResultSet rs=con.execQuery(sql);while(rs.next()){row=sheet.createRow(nRow++);cell=row.createCell((short)0);cell.setEncoding(HSSFCell.ENCODING_UTF_16);cell.setCellValue(rs.getString("name"));cell=row.createCell((short)1);cell.setEncoding(HSSFCell.ENCODING_UTF_16);cell.setCellValue(rs.getString("email"));}rs.close();}catch(SQLException e){System.out.println("POIExcel.exportExcel()"+e.getMessage());}try{wb.write(out);}catch(Exception e){System.out.println("POIExcel.exportExcel()"+e.getMessage());}}}程序首先创建一个HSSFWorkbook实例,它相当于一个Excel文件,然后创建HSSFSheet,它相当于一个Excel文件的一页。
在创建了页对象之后,就可以向该页中添加内容了。
POI将Excel文件页面中的每行用HSSFRow来表示,而每个单元格用HSFFCell对象来表示。
向页面添加内容时,首先创建行,然后再创建行所包含的单元格,设置单元格的数据。
向行中添加单元格时,行的列是以0开始进行索引的。
语句cell.setEncoding(HSFFCell.ENCODING_UTF_16)用来说明单元格中的数据的编码是UTF-16,以便处理汉字,否则默认编码不能识别汉字,将会出现乱码。
最后调用HSSFWorkbook的write方法输出添加好内容的Excel文件。
POI提供的类和方法很丰富,远不止这里用到的,在进行实际开发时还需要参考相关的手册。
下面是用来调用该Servlet实现POI操作并生成Excel的Servlet代码,文件名为POITest.java。
package myBean;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import myBean.POIExcel;public class POITest extends HttpServlet {private static final long serialVersionUID = 1L;public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("application/vnd.ms-excel");POIExcel excel=new POIExcel();excel.exportExcel("user",response.getOutputStream());}}语句response.setContentType(“application/vnd.ms-excel”);用来说明返回到客户端的数据为Excel格式。
随后两句首先创建了POIExcel对象,然后调用它的exportExcel()方法输出Excel文件。
(3)在web.xml中的配置代码:<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4"xmlns="/xml/ns/j2ee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/j2ee/xml/ns/j2ee/web-app_2_4.xsd"><servlet><description>EXCEL</description><display-name>EXCEL</display-name><servlet-name>POITest</servlet-name><servlet-class>myBean.POITest</servlet-class></servlet><servlet-mapping><servlet-name>POITest</servlet-name><url-pattern>/POITest</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>(4)程序的运行结果如下:第三种方法:如何使用JXL组件操作ExcelJXL组件介绍JXL组件可从网址/jexcelapi/下载,下载后,将jxl.jar加入classpath,或者把jxl.jar文件拷到工程目录的lib目录下,或者拷到Tomcat安装目录下的common\lib目录下。