POIレポートの開始
ミーム管理システムでは、人事管理や注文などの操作には、レポートやその他のロジックのインポートとエクスポートが必要です。要件は複雑で、実際はデータベーステーブルの基本的な操作です。この記事では、Excelのエクスポートと次回のデータのインポートについて紹介します。
POIレポートの概要
デジタルを要求する
エンタープライズアプリケーション開発では、Excelレポートは最も一般的なレポート要件の1つです。Excelレポートを作成するには、一般に2つの方法があります。
- 操作を容易にするために、Excelレポートに基づいてデータをバッチでアップロードします
- Javaコードを使用してExcelレポートを生成する
Excelの2つの形式
現在、ExcelにはExcel2003とExcel2007以降の2つのバージョンがあり、2つの違いは次のとおりです。
一般的なExcel操作ツール:
Javaには、jxlとpoiの2つの一般的なEXCEL操作モードがあります。
- JXLはEXCELでのみ動作でき、構造は古く、Excel95-2000バージョンのみをサポートするようになり、更新とメンテナンスを停止します
- POIはapacheプロジェクトであり、office2003および2007を含むMicrosoft Word、EXCEL、PPTで動作でき、poiが更新され、すべてがより主流になっています。
POI入力操作
POI環境の構築
<!--POI Excel-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.0.1</version>
</dependency>
POI構造の説明
- HSSFは、Excelの読み取りおよび書き込み用のxls形式のファイルを提供します
- XSSFは、Excelの読み取りおよび書き込み用のXLSX形式のドキュメントを提供します
- HWPFは、Wordを読み書きするためのドキュメント形式のドキュメントを提供します
- HSLFは、Wordを読み書きするためのPPT形式のドキュメントを提供します
- HDGFは、Visio形式のドキュメントを読み取るために提供します
- HSMFは、Outlook形式のドキュメントの読み取りを提供します
-
HPBFは、パブリッシャー形式のドキュメントを読み取るために提供します
APIの紹介
- WorkBook:EXCELドキュメントオブジェクト。さまざまなExcelタイプに分割されています:HSSFWorkbook(2003)およびXSSFWorkbook(2007)
- シート:Excelシート
- 行:Excel行
- セル:Excelのセルグリッド
- フォント:Excelフォント
- CellStyle:セルスタイル
基本操作
Excelを作成する
public class PoiTest01 {
//测试创建excel文件
public static void main(String[] args) throws Exception {
//1.创建workbook工作簿
Workbook wb = new XSSFWorkbook();
//2.创建表单Sheet
Sheet sheet = wb.createSheet("test");
//3.文件流
FileOutputStream fos = new FileOutputStream("E:\\test.xlsx");
//4.写入文件
wb.write(fos);
fos.close();
}
}
セルを作成する
//测试创建单元格
public static void main(String[] args) throws Exception {
//1.创建workbook工作簿
Workbook wb = new XSSFWorkbook();
//2.创建表单Sheet
Sheet sheet = wb.createSheet("test");
//3.创建行对象,从0开始
Row row = sheet.createRow(3);
//4.创建单元格,从0开始
Cell cell = row.createCell(0);
//5.单元格写入数据
cell.setCellValue("传智播客");
//6.文件流
FileOutputStream fos = new FileOutputStream("E:\\test.xlsx");
//7.写入文件
wb.write(fos);
fos.close();
}
書式設定
//创建单元格样式对象
CellStyle cellStyle = wb.createCellStyle();
//设置边框
cellStyle.setBorderBottom(BorderStyle.DASH_DOT);//下边框
cellStyle.setBorderTop(BorderStyle.HAIR);//上边框
//设置字体
Font font = wb.createFont();//创建字体对象
font.setFontName("华文行楷");//设置字体
font.setFontHeightInPoints((short)28);//设置字号
cellStyle.setFont(font);
//设置宽高
sheet.setColumnWidth(0, 31 * 256);//设置第一列的宽度是31个字符宽度
row.setHeightInPoints(50);//设置行的高度是50个点
//设置居中显示
cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
//设置单元格样式
cell.setCellStyle(cellStyle);
//合并单元格
CellRangeAddress region =new CellRangeAddress(0, 3, 0, 2);
sheet.addMergedRegion(region);
写真を挿入
//绘制图形
public static void main(String[] args) throws Exception {
//1.创建workbook工作簿
Workbook wb = new XSSFWorkbook();
//2.创建表单Sheet
Sheet sheet = wb.createSheet("test");
//读取图片流
FileInputStream stream=new FileInputStream("e:\\logo.jpg");
byte[] bytes= IOUtils.toByteArray(stream);
//读取图片到二进制数组
stream.read(bytes);
//向Excel添加一张图片,并返回该图片在Excel中的图片集合中的下标
int pictureIdx = wb.addPicture(bytes,Workbook.PICTURE_TYPE_JPEG);
//绘图工具类
CreationHelper helper = wb.getCreationHelper();
//创建一个绘图对象
Drawing<?> patriarch = sheet.createDrawingPatriarch();
//创建锚点,设置图片坐标
ClientAnchor anchor = helper.createClientAnchor();
anchor.setCol1(0);//从0开始
anchor.setRow1(0);//从0开始
//创建图片
Picture picture = patriarch.createPicture(anchor, pictureIdx);
picture.resize();
//6.文件流
FileOutputStream fos = new FileOutputStream("E:\\test.xlsx");
//7.写入文件
wb.write(fos);
fos.close();
}
POIレポートのエクスポート
要件が何であれ、レポートのエクスポートのみが次の手順を必要とします。
- Excelテーブルデータを作成する
- ワークブックを作成する
- シートオブジェクトを作成する
- 行オブジェクトを作成します
- Cellオブジェクトを作成する
- データの入力、スタイルの設定、
ダウンロード。例としてユーザーデータを取り上げます。私の記事を使用したことがない人は、公式アカウントをフォローして前の記事を読むことができます。FileUtilファイル操作一般クラスの作成
package com.cn.greemes.common.util;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.poi.excel.BigExcelWriter;
import cn.hutool.poi.excel.ExcelUtil;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* 文件操作
*/
public class FileUtil {
public static final String SYS_TEM_DIR =System.getProperty("java.io.tmpdir")+ File.separator;
public static void downloadExcel(List<Map<String, Object>> list, HttpServletResponse response) throws IOException {
String tempPath = SYS_TEM_DIR + IdUtil.fastSimpleUUID() + ".xlsx";
File file = new File(tempPath);
BigExcelWriter writer = ExcelUtil.getBigWriter(file);
// 一次性写出内容,使用默认样式,强制输出标题
writer.write(list, true);
SXSSFSheet sheet = (SXSSFSheet)writer.getSheet();
//上面需要强转SXSSFSheet 不然没有trackAllColumnsForAutoSizing方法
sheet.trackAllColumnsForAutoSizing();
//列宽自适应
writer.autoSizeColumnAll();
//response为HttpServletResponse对象
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
//test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
response.setHeader("Content-Disposition", "attachment;filename=file.xlsx");
ServletOutputStream out = response.getOutputStream();
// 终止后删除临时文件
file.deleteOnExit();
writer.flush(out, true);
//此处记得关闭输出Servlet流
IoUtil.close(out);
}
}
コントローラで設定する
@ApiOperation("导出用户数据")
@RequestMapping(value = "/export", method = RequestMethod.GET)
@ResponseBody
public void export(HttpServletResponse response, @RequestParam(value = "keyword", required = false) String keyword,
@RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) throws UnsupportedEncodingException, IOException {
Page<MesAdmin> adminList = adminService.list(keyword, pageSize, pageNum);
List<Map<String,Object>> list = new ArrayList();
for(int i=0;i<149;i++) {
for (MesAdmin umsAdmin : adminList.getRecords()) {
Map<String, Object> map = new LinkedHashMap<>(6);
map.put("姓名", umsAdmin.getUsername());
map.put("邮箱", umsAdmin.getEmail());
map.put("昵称", umsAdmin.getNickName());
map.put("备注信息", umsAdmin.getNote());
map.put("创建时间", umsAdmin.getCreateTime());
map.put("最后登录时间", umsAdmin.getLoginTime());
list.add(map);
}
}
fileUtil.downloadExcel(list,response);
}
結論:
今回はExcelのエクスポートを紹介し、次回はExcelのインポートを紹介します。これが私の仕事のまとめです。何かおかしいことがあれば、もっと率直に一緒に進んでください、ありがとうございます!
Githubアドレス:
githubアドレス:https://github.com/bangbangzhou/greemes/tree/master