【MySQL × SpringBoot 小點子】全面實現(xiàn)流程 · 數(shù)據(jù)庫導(dǎo)出Excel表格文件的接口
在上一篇博客,【MySQL × SpringBoot 突發(fā)奇想】全面實現(xiàn)流程 · xlsx文件,Excel表格導(dǎo)入數(shù)據(jù)庫的接口_s:103的博客-CSDN博客
我們學(xué)習(xí)了如何導(dǎo)入表格,現(xiàn)在我們反過來,看看如何導(dǎo)出表格~
1. 什么是VO(View Object)對象
網(wǎng)絡(luò)資料:
View Object(視圖對象)是一種在軟件開發(fā)中常見的設(shè)計模式,它用于在用戶界面(UI)層與業(yè)務(wù)邏輯層(業(yè)務(wù)模型)之間進(jìn)行數(shù)據(jù)交互。其主要目的是在UI層提供一個面向用戶的數(shù)據(jù)模型,將業(yè)務(wù)模型中的數(shù)據(jù)進(jìn)行適配、處理和展示,從而實現(xiàn)UI與業(yè)務(wù)邏輯的解耦。
View Object具有以下特點和作用:
封裝數(shù)據(jù):View Object通過封裝業(yè)務(wù)模型中的數(shù)據(jù),將其進(jìn)行適配和轉(zhuǎn)換,以適應(yīng)UI層的需求。它可以包含計算屬性、格式化數(shù)據(jù)、過濾數(shù)據(jù)等操作,使得UI層能夠更直接地訪問和展示數(shù)據(jù)。
提供友好的數(shù)據(jù)接口:View Object通常會為UI層提供簡單和易于使用的數(shù)據(jù)接口,使得UI層可以輕松地獲取和修改其中的數(shù)據(jù)。它往往會提供諸如getters、setters、事件通知等方法,以便UI層對其數(shù)據(jù)進(jìn)行操作和監(jiān)聽。
簡化UI開發(fā):通過使用View Object,UI開發(fā)人員可以專注于UI設(shè)計和交互邏輯的實現(xiàn),而無需過多關(guān)注業(yè)務(wù)邏輯的處理和數(shù)據(jù)處理等細(xì)節(jié)。同時,View Object還可以提供數(shù)據(jù)驗證、狀態(tài)管理等功能,簡化UI開發(fā)過程。
實現(xiàn)UI與業(yè)務(wù)邏輯的解耦:View Object作為UI層與業(yè)務(wù)邏輯層之間的中間層,可以實現(xiàn)兩者的解耦。它可以根據(jù)UI層的需求對業(yè)務(wù)模型進(jìn)行適配,使得業(yè)務(wù)模型的變化對UI層來說是透明的,從而提高系統(tǒng)的靈活性和可維護(hù)性。
需要注意的是,View Object并不是所有項目中必須存在的概念,它在一些復(fù)雜的UI交互、數(shù)據(jù)處理較為復(fù)雜的場景下更常見,并且在不同的技術(shù)棧和框架中實現(xiàn)方式也會有所差異。
我覺得最重要的一點就是,滿足前端需求的一組數(shù)據(jù)
在前后端交互過程中,一般有三種情況:
- 后端的一個實體類需要刪減一些數(shù)據(jù),不發(fā)給前端
- 后端的一個實體類需要多加一些數(shù)據(jù),發(fā)給前端
- 后端的一個實體類全部信息都發(fā)給前端
第三種不必多說,正常寫代碼;
第二種我們也很常見,vo對象擴(kuò)展我們的實體類,新增屬性,例如聯(lián)合對象啥的,也可以通過返回哈希表實現(xiàn);
第一種我們也可以實現(xiàn),可以通過注解讓一個屬性不參與序列化而實現(xiàn),也可以用一個vo對象,其中只包含實體類的一部分屬性,之后通過一個方法,將實體類與vo對象之間進(jìn)行數(shù)據(jù)賦值。
2. BeanCopyUtils進(jìn)行兩個對象的數(shù)據(jù)轉(zhuǎn)移
名字是這樣的,我們也可以作用于不是bean對象的呀~
public class BeanCopyUtils {
private BeanCopyUtils() {
}
/** 單個對象*/
public static <V> V copyBean(Object source, Class<V> clazz) {
/** 創(chuàng)建目標(biāo)對象 實現(xiàn)屬性拷貝*/
V result = null;
try {
result = clazz.newInstance();
/** 拷貝*/
BeanUtils.copyProperties(source, result);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/** 集合*/
public static <O, V> List<V> copyBeanList(List<O> list, Class<V> clazz) {
/** 創(chuàng)建目標(biāo)對象 實現(xiàn)屬性拷貝*/
return list.stream()
.map(o -> copyBean(o, clazz))
.collect(Collectors.toList());
}
}
- copyBean方法,將第一個參數(shù)轉(zhuǎn)換為第二個參數(shù)(類對象)的類型
- 轉(zhuǎn)化邏輯是通過相同的屬性名
- copyBeanList方法,將第一個參數(shù)列表轉(zhuǎn)換為第二個參數(shù)(類對象)的類型的列表
- 轉(zhuǎn)化邏輯是通過相同的屬性名
3. mapper層實現(xiàn)
這里我圖方便,直接用注解實現(xiàn)mapper方法
示例:
小開發(fā)是這樣的,正經(jīng)開發(fā)可不是這樣不嚴(yán)謹(jǐn)?shù)泥福?/p>
4. service層實現(xiàn)
示例:
5. vo對象創(chuàng)建
示例:Course對象的表格展示vo對象
@Data
@NoArgsConstructor
@AllArgsConstructor
@ExcelTarget("excelCourse")//表格實體類的id,可以針對一個實體類做不同導(dǎo)出,本文暫時不涉及
public class ExcelCourseVo {
@Excel(name = "course", width = 20)//列名、寬度
private String course_name;
@Excel(name = "credit", width = 20)
private BigDecimal credit;
@Excel(name = "school", width = 20)
private Integer school_year;
@Excel(name = "semester", width = 20)
private Integer semester;
}
6. 保存路徑配置
public class Constants {
// excel表
public static final String XLSX_DIR = "D:\\study\\excel";
public static final String XLSX_NAME1 = "easypoi1.xlsx";
public static final String XLSX_NAME2 = "easypoi2.xlsx";
public static final String XLSX_NAME3 = "easypoi3.xlsx";
public static final String XLSX_NAME4 = "easypoi4.xlsx";
}
7. controller層核心代碼實現(xiàn)
示例:
@GetMapping("/print")
@ApiOperation("打印表格")
public void print() {
List<Course> list = courseService.selectAll();
List<ExcelCourseVo> excelCourseVos = BeanCopyUtils.copyBeanList(list, ExcelCourseVo.class);
// 導(dǎo)出
ExportParams params = new ExportParams();
params.setTitle("測試");
// 表格左下角sheet名稱
params.setSheetName("課程信息");
Workbook workbook = ExcelExportUtil.exportExcel(params, ExcelCourseVo.class, excelCourseVos);
try{
// 文件夾是否存在,若沒有對應(yīng)文件夾直接根據(jù)路徑生成文件會報錯
File folder = new File(Constants.XLSX_DIR);
if (!folder.exists() && !folder.isDirectory()) {
folder.mkdirs();
}
// 文件是否存在
File file = new File(Constants.XLSX_DIR + "\\" + Constants.XLSX_NAME1);
if (!file.exists()){
file.createNewFile();
}
// 輸出流寫入(覆蓋)
FileOutputStream outputStream = new FileOutputStream(Constants.XLSX_DIR + "\\" + Constants.XLSX_NAME1);
workbook.write(outputStream);
// 關(guān)閉寫,不然用戶點擊生成的文件會顯示只讀
outputStream.close();
workbook.close();
}catch (IOException e){
e.printStackTrace();
}
System.out.println("打印成功");
}
8. wagger接口
示例:
找到對應(yīng)目錄:
導(dǎo)出成功:
9. 補(bǔ)充
你如果比較懶,那就用原始的那個實體類對象就行了:
- 因為實體類和vo對象在程序眼里都是自定義的類罷了,只是我們?nèi)藶榈慕o他們意義
效果:
強(qiáng)烈注意: 對表格的列名起名要正常,可以是中文啥的,但是不要出現(xiàn)一些奇奇怪怪的字符,例如下劃線就不行,這是我血的教訓(xùn)??????
文章到此結(jié)束!謝謝觀看
可以叫我 小馬,我可能寫的不好或者有錯誤,但是一起加油鴨??!文章來源:http://www.zghlxwxcb.cn/news/detail-713588.html代碼:memory · 游離態(tài)/馬拉圈2023年10月 - 碼云 - 開源中國 (gitee.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-713588.html
到了這里,關(guān)于【MySQL × SpringBoot 突發(fā)奇想】全面實現(xiàn)流程 · 數(shù)據(jù)庫導(dǎo)出Excel表格文件的接口的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!