話不多說 上java代碼
@SpringBootTest(classes = {ShujiegouApplication.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class PoiTestDataBaseNoTwo {
@Autowired
private SysColumnService sysColumnService;
@Test
public void test1() throws Exception{
/**
* 獲取數據庫中的數據 填充在Excel表格中
* @throws Exception
*/
// 準備數據
List<String> titles = Arrays.asList("欄目Id","欄目名稱","欄目父id值","菜單級別","跳轉頁面");
// 數據查詢 上師全部的數據
List<SysColumn> sysColumnAll = sysColumnService.getSysColumnAll();
// List<SysColumn> sysColumnAll = sysColumnMapper.selectAll();
// 1. 新建一個HSSFWorkbook 對象
HSSFWorkbook workbook = new HSSFWorkbook();
// 單元格樣式對象 設置樣式
HSSFCellStyle cellStyle = workbook.createCellStyle();
HSSFFont font = workbook.createFont();
font.setColor((short)10);
font.setFontName("宋體");
cellStyle.setFont(font);
// 2. 新建一個HSSFSheet對象
HSSFSheet sheet = workbook.createSheet("guru");
// 3. 寫入標題欄數據
// 創建行
HSSFRow titleRow = sheet.createRow(0);
for (int i = 0; i < titles.size(); i++) {
// 創建單元格
HSSFCell titleCell = titleRow.createCell(i);
// 添加樣式
titleCell.setCellStyle(cellStyle);
// 寫入數據
titleCell.setCellValue(titles.get(i));
}
// 4. 寫入上師數據
for (int i = 0; i < sysColumnAll.size(); i++) {
SysColumn sysColumn = sysColumnAll.get(i);
// 創建行
HSSFRow row = sheet.createRow(i + 1);
// 創建單元格
// 反射開始
Class<? extends SysColumn> sysColumnClass = sysColumn.getClass();
// 10.2 獲取屬性數組
Field[] declaredFields = sysColumnClass.getDeclaredFields();
// 10.3遍歷數組
for (int j = 0; j < declaredFields.length; j++) {
// 10.4 獲取屬性名
String guruField = declaredFields[j].getName();
// 10.5 拼接出來get方法名
String guruGetMethod = "get"+guruField.substring(0,1).toUpperCase()+guruField.substring(1);
// 10.6 調用get方法獲取返回值
Object invoke = sysColumnClass.getDeclaredMethod(guruGetMethod, null).invoke(sysColumn, null);
// 10.7創建單元格
HSSFCell cell = row.createCell(j);
// 10.8把返回值寫入單元格中
// 根據實際業務需求酌情添加 類型判斷
// if(invoke instanceof Date){
// 根據實際業務需求酌情添加 類型判斷
// }
cell.setCellValue(invoke.toString());
}
}
// 5. 輸出
workbook.write(new FileOutputStream(new File("E://gurua.xls")));
}
}
效果圖
這裏講一下爲什麼要使用反射。
因爲在導出的時候,如果不使用反射,如果你的類裏有100個屬性,那麼你需要調用100次set方法進行給單元格賦值。
所以說爲了方便,需要使用反射的技術。
這輩子堅持與不堅持都不可怕,怕的是獨自走在堅持的道路上!