转载地址:https://www.it610.com/article/1283006414427537408.htm
所需pom
org.apache.poi poi 3.15-beta2 org.apache.poi poi-ooxml 3.15-beta2 net.sf.jxls jxls-core 1.0-RC-1
1. excel模板
1 .1这里有坑要注意
1.1.1 注意看图 里面最后一列“获工业油气流井层” 是两列合并的,所以在第5、7行也就是写和这里不要合并要拆分开,因为你这里合并的话导出的时候会报这里有合并与原有的格式冲突的错误,所以这里不要合并,至于第6行是遍历获取数据的和上方标题对应该合并的合并,这个没有问题
1.1.2 注意第5和第7行 这里把遍历写到第一个列了
1.2 数据解释
是遍历数据的 其中 data是要遍历的数据 至于p就是下面用来点里面的数据的
${p.name}就不用多说了 这就是点出数据的
2.下面是模板所在的路径 在代码里一会要读取模板的(这个用的是spring boot的框架 其他框架也能用这个方法导出,只不过不能肯定 读取模板的方法 其他框架是否能用 如果不能用则换一下读取模板的方法就可)
如图 模板在 resources下面的excel里
3.代码
import net.sf.jxls.transformer.XLSTransformer;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.stereotype.Controller;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.*;
/**
* @Auther: 史**
* @Date: 2019/11/28 15:39
* @ClassName: ExcelController
* @Description: TODO
*/
@Controller
public class ExcelController {
/**
* 因为我的模板里有三个表 所以我放了三次数据 你们有一个的可以放入一个数据
*/
@RequestMapping("/export")
public void export(HttpServletRequest request , HttpServletResponse response){
try {
// 循环数据
List list = new ArrayList<>();
// 表一数据
for (int i = 1; i <= 5; i++) {
Map<string, object=""> map = new HashMap<>();
map.put("name", "测试项目" + i);
map.put("worNum", i);
map.put("comNum", 10);
map.put("oil", 5);
map.put("gas", (int) (Math.random() * 200));
map.put("oilGas", (int) (Math.random() * 200));
map.put("oilWater", (int) (Math.random() * 200));
map.put("gasWater", (int) (Math.random() * 200));
map.put("heavyOil", (int) (Math.random() * 200));
map.put("oum", (int) (Math.random() * 200));
map.put("success", (49 + i) + "%");
map.put("num", (int) (Math.random() * 200));
list.add(map);
}
// 表二数据
List list1 = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
Map<string, object=""> map = new HashMap<>();
map.put("test", "测试井次" + i);
map.put("success", i);
map.put("successRate", 10);
map.put("testNum", 5);
map.put("qualifiedNum", (int) (Math.random() * 200));
map.put("qualifiedRate", (int) (Math.random() * 200));
map.put("num", (int) (Math.random() * 200));
map.put("rate", (int) (Math.random() * 200));
list1.add(map);
}
// 表三数据
List list2 = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
Map<string, object=""> map = new HashMap<>();
map.put("successRate", "测试井次" + i);
map.put("qualifiedRate", i);
map.put("accurateRate", 10);
map.put("test", 5);
map.put("num", (int) (Math.random() * 200));
map.put("samplingRate", (int) (Math.random() * 200));
map.put("sp", (int) (Math.random() * 200));
map.put("stp", (int) (Math.random() * 200));
map.put("oil", (int) (Math.random() * 200));
map.put("gas", (int) (Math.random() * 200));
map.put("water", (int) (Math.random() * 200));
list2.add(map);
}
// 表格使用的数据
Map map = new HashMap();
map.put("data", list);//放入表一数据
map.put("data1", list1);//放入表二数据
map.put("data2", list2);//放入表三数据
// 获取模板文件
File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "excel/shiyoudizhinianbao.xls");
InputStream inputStream = new FileInputStream(file);
// 获取 Workbook ,传入 模板 和 数据 这里是读取的模板
XLSTransformer xlsTransformer = new XLSTransformer();
Workbook workbook = xlsTransformer.transformXLS(inputStream, map);
// 设置文件名
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("试油地质年报.xls", "UTF-8"));
// 写出文件
OutputStream os = new BufferedOutputStream(response.getOutputStream());
// 输出
workbook.write(os);
// 关闭
inputStream.close();
//刷新
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
到这里就已经完成了 剩下的直接访问就可以了 下面上两张导出成功的截图
为了看数据 我最后缩小了一下表格