вводить
инструмент экспорта excel
Структура кода всего проекта выглядит следующим образом
com
\---utils
+---demo # 案例相关
| | ExcelExportApplication.java # springboot启动类
| |
| +---bean
| | DemoBean.java # 测试bean
| |
| +---controller
| | ExcelExportController.java # 测试url访问弹出下载excel文件和导出excel到文件
| |
| \---exportParam
| | DemoExportParam.java # 导出参数
| |
| \---dataConversion
| HobbyConversion.java # 爱好属性导出转换类
| SexConversion.java # 性别属性导出转换类
|
\---excelExport # 导出工具包
| AsyncExportExcel.java #多线程导出
| ExportExcel.java # 导出工具类
|
+---data
| BaseParam.java # 基础导出参数类
|
+---dataConversion
| DataExportConversion.java # 属性导出转换接口
|
+---defaultDataHandle # 默认的数据处理
| AbstractDataHandler.java
| BooleanDataHandler.java
| DataHandlerFactory.java
| DateDataHandler.java
| StringDataHandler.java
|
\---style # 默认的样式
AbstractCellStyle.java
DefaultDataCellStyle.java
DefaultTitleCellStyle.java
Проще говоря, экспорт в Excel можно разделить на несколько шагов.
- Получите данные, которые необходимо экспортировать
- Задайте имя рабочего листа в excel
- Установите первую строку текущего рабочего листа, которая является строкой заголовка
- Заполните данные построчно и преобразуйте необходимые данные
использовать
Класс инструментов ExportExcel
Сначала создайте экземпляр класса инструмента ExportExcel, здесь я предоставляю три конструктора.
public ExportExcel()
public ExportExcel(SXSSFWorkbook workbook)
public ExportExcel(SXSSFWorkbook workbook, AbstractCellStyle titleCellStyle, AbstractCellStyle dataCellStyle)
Обычно используется конструктор без аргументов. Два других должны создавать экземпляр объекта рабочей книги сами по себе.Конструктор с тремя параметрами должен передать рабочую книгу, объект стиля строки заголовка и объект стиля строки данных. Ниже приведены инструкции по объектам стиля.
После создания экземпляра класса инструмента ExportExcel необходимо вызвать метод exportExcel, который определяется следующим образом.
public void exportExcel(String sheetName, BaseParam baseParam, OutputStream out)
имя параметра | Содержание параметра |
---|---|
sheetName | Имя рабочего листа |
baseParam | Объект параметра экспорта, который наследует BaseParam (будет объяснен позже) |
out | Объекты OutputStream, такие как FileOutputStream |
Стиль абстрактного класса AbstractCellStyle
public abstract class AbstractCellStyle {
Workbook workbook;
CellStyle style;
Font font;
public AbstractCellStyle(Workbook workbook) {
this.workbook = workbook;
style = workbook.createCellStyle();
font = workbook.createFont();
}
protected abstract void setStyle();
protected abstract void setFont();
public CellStyle getCellStyle() {
style.setFont(font);
return style;
}
}
Наследуя абстрактный класс стиля AbstractCellStyle, можно реализовать следующие два метода.
// 设置样式
protected abstract void setStyle();
// 设置字体
protected abstract void setFont();
С помощью этих двух методов вы можете изменить стиль и шрифт ячейки.
Базовый класс параметров экспорта BaseParam
Код класса BaseParam выглядит следующим образом.
public class BaseParam {
public List data = new ArrayList<>();
public List<ColumnParam> columnParams = new ArrayList<>();
//Set Get Constructor
/**
* 数据行参数
*/
public class ColumnParam{```}
}
Атрибуты
Вы можете видеть, что класс BaseParam имеет два свойства.
public List data = new ArrayList<>();
public List<ColumnParam> columnParams = new ArrayList<>();
data, несомненно, хранит данные, которые необходимо экспортировать, а columnParams хранит данные каждого столбца.Теперь давайте посмотрим на внутренний класс ColumnParam
Внутренний класс ColumnParam
public class ColumnParam{
private String headerName;
private String fieldName;
private DataExportConversion conversion;//数据转换
//Set Get Constructor
}
Атрибуты
Имя свойства | содержание свойства |
---|---|
headerName | название титула |
fieldName | Имя атрибута, соответствующее классу сущности |
conversion | объект преобразования данных |
Интерфейс преобразования данных DataExportConversion
public interface DataExportConversion<T> {
String transferData(T data);
}
Например, полученные данные 0, 1, а затем вам нужно преобразовать данные в женские и мужские, затем вы можете реализовать интерфейс преобразования данных DataExportConversion и настроить формат вывода преобразования, Код выглядит следующим образом
public class SexConversion implements DataExportConversion<Integer> {
@Override
public String transferData(Integer data) {
if (0 == data){
return "女";
} else if (1 == data){
return "男";
}
return "不详";
}
}
кейс
Сцены
Исходные данные следующие
Имя | Пол | Дата рождения | Хобби (Список объектов) |
---|---|---|---|
пыльное сердце | 0 | 2018-08-08 14:59:11 | [танцующие мечи, получающие оружие] |
Цяньюэ | 1 | 2018-08-08 14:59:11 | [петь и танцевать] |
необходимо преобразовать в следующее
Имя | Пол | Дата рождения | Хобби |
---|---|---|---|
пыльное сердце | Женский | 2018-08-08 14:59:11 | танцевальный нож |
Цяньюэ | мужчина | 2018-08-08 14:59:11 | петь и танцевать |
Класс сущности выглядит следующим образом
public class DemoBean {
//姓名
private String name;
//性别,0->女,1->男
private Integer sex;
//出生日期
private Date birthday;
//爱好
private List<String> hobbies;
//Set Get
}
конверсия данных
Видно, что необходимо преобразовать два атрибута, а именно пол и хобби. Преобразование данных пола уже есть, поэтому выкладывать не буду.Далее преобразование данных хобби
public class HobbyConversion implements DataExportConversion<List<String>> {
@Override
public String transferData(List<String> data) {
StringBuilder hobby = new StringBuilder();
for (String s:data){
hobby.append(s).append(",");
}
//移除最后一个逗号
if (hobby.length() >= 1){
hobby.deleteCharAt(hobby.length()-1);
}
return hobby.toString();
}
}
класс параметров экспорта
После того, как класс преобразования данных написан, начните писать класс параметров экспорта, код выглядит следующим образом.
public class DemoExportParam extends BaseParam {
public DemoExportParam(List<DemoBean> list) {
setData(list);
setColumnParam();
}
private void setColumnParam() {
columnParams.add(new ColumnParam("姓名","name"));
columnParams.add(new ColumnParam("性别","sex", new SexConversion()));
columnParams.add(new ColumnParam("出生日期","birthday"));
columnParams.add(new ColumnParam("爱好","hobbies", new HobbyConversion()));
}
}
При создании экземпляра DemoExportParam вам необходимо передать экспортированные данные и одновременно установить параметр столбца ColumnParam, соответствующий каждому столбцу.
Вы можете видеть, что всего 4 параметра столбца.
- Имя заголовка первого столбца — имя, а имя соответствующего атрибута — имя
- Имя заголовка второго столбца — пол, имя соответствующего атрибута — пол, а объект преобразования данных — SexConversion.
- Имя заголовка третьего столбца — это дата рождения, а имя соответствующего атрибута — день рождения.
- Название заголовка четвертого столбца — хобби, имя соответствующего атрибута — хобби, а объект преобразования данных — HobbyConversion.
экспорт
Сначала напишите метод для генерации данных следующим образом
private List<DemoBean> getDemoBeanList(){
DemoBean man = new DemoBean();
DemoBean woman = new DemoBean();
String[] manHobbys = {"舞刀", "弄枪"};
String[] womanHobbys = {"唱歌", "跳舞"};
man.setName("尘心").setBirthday(new Date()).setSex(0).setHobbies(Arrays.asList(manHobbys));
woman.setName("千月").setBirthday(new Date()).setSex(1).setHobbies(Arrays.asList(womanHobbys));
//将两个bean添加到list中
List<DemoBean> list = new ArrayList<>();
list.add(man);
list.add(woman);
return list;
}
Затем есть два метода экспорта данных: один — получить доступ к всплывающему URL-адресу для загрузки файла Excel, а другой — экспортировать Excel в файл.
всплывающее окно доступа к URL для загрузки файла excel
@ResponseBody
@RequestMapping("/export")
public void exportByWeb(HttpServletResponse response) throws IOException {
OutputStream out = new BufferedOutputStream(response.getOutputStream());
response.reset();
String headStr = "attachment; filename=" + URLEncoder.encode("导出demo.xlsx", "utf-8");
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Content-Disposition", headStr);
//获得导出数据
List<DemoBean> list = getDemoBeanList();
DemoExportParam demoExportParam = new DemoExportParam(list);
ExportExcel exportExcel = new ExportExcel();
exportExcel.exportExcel("demo", demoExportParam, response.getOutputStream());
out.flush();
out.close();
}
экспортировать excel в файл
@Test
public void exportByFile() throws IOException {
File file = new File("F:\\导出demo.xlsx");
FileOutputStream out = new FileOutputStream(file);
//获得导出数据
List<DemoBean> list = getDemoBeanList();
DemoExportParam demoExportParam = new DemoExportParam(list);
ExportExcel exportExcel = new ExportExcel();
exportExcel.exportExcel("demo", demoExportParam, out);
out.flush();
out.close();
}
Расположение проекта:GitHub.com/rainbowbig/U…, можете скачать при необходимости.