diff --git a/app/src/components/AccountManage.vue b/app/src/components/AccountManage.vue index 3125e4e..d0c5268 100644 --- a/app/src/components/AccountManage.vue +++ b/app/src/components/AccountManage.vue @@ -63,7 +63,7 @@ - + @@ -89,6 +89,9 @@ + + + {{item.level === '0' ? '超級管理員' : ''}} {{item.level === '1' ? '一般管理員' : ''}} @@ -129,7 +132,7 @@ - + diff --git a/app/src/components/AssetGroup.vue b/app/src/components/AssetGroup.vue index 3c5e550..c88006b 100644 --- a/app/src/components/AssetGroup.vue +++ b/app/src/components/AssetGroup.vue @@ -411,12 +411,12 @@ :item-text="selectColItem.boolean.text" :item-value="selectColItem.boolean.value" /> - - 編輯選項 - + + + + + + - + + v-model="modifyTypeSelectItem" /> { + if (this.insertColItem.colname === col.colname) { + alert('資料庫欄位名不可重複'); + stop = true; + return; + } + }); + if (stop === true) return; this.insertColItem.tablename = this.assertGroup[this.currentTab].value; this.insertColItem.insertSelectItems = this.insertSelectItems; this.$axios.post(`/assert/col`, this.insertColItem).then(() => { @@ -726,6 +724,9 @@ this.insertSelectItems = []; delete this.insertColItem.tablename; delete this.insertColItem.insertselectItems; + Object.keys(this.insertColItem).forEach((key) => { + this.insertColItem[key] = ''; + }); } ); @@ -755,12 +756,15 @@ }); }, modifyCol() { + let stop; for (const key in this.modifyColItem) { if (this.modifyColItem[key] === '') { alert('所有資料不可為空'); + stop = true; return; } } + if (stop === true) return; this.modifyColItem.tablename = this.assertGroup[this.currentTab].value; this.modifyColItem.modifySelectItems = this.modifySelectItems; this.modifyColItem.oldIndex = this.oldIndex; @@ -771,6 +775,9 @@ delete this.modifyColItem.tablename; delete this.modifyColItem.modifySelectItems; delete this.modifyColItem.oldIndex; + Object.keys(this.modifyColItem).forEach((key) => { + this.modifyColItem[key] = ''; + }); } ); @@ -778,7 +785,7 @@ deleteCol(item) { let yes = confirm('確定刪除'); if (yes) { - this.$axios.delete(`/assert/deleteCol?tablename=${item.tablename}&&colname=${item.colname}`).then(() => { + this.$axios.delete(`/assert/deleteCol?tablename=${item.tablename}&&colname=${item.colname}&&index=${item.index}`).then(() => { this.getCols(); alert('已刪除'); }); diff --git a/app/src/components/Home.vue b/app/src/components/Home.vue index ab21ded..6e43cfa 100644 --- a/app/src/components/Home.vue +++ b/app/src/components/Home.vue @@ -224,6 +224,7 @@ if (level === '0') { this.items.push({'text': '資訊資產群組', 'route': '/asset_group'}); this.items.push({'text': '帳號與權限管理', 'route': '/account'}); + this.items.push({'text': '資產類別管理', 'route': '/type'}); } //一般管理員 if (level === '1') { diff --git a/app/src/components/TypeManage.vue b/app/src/components/TypeManage.vue new file mode 100644 index 0000000..db0bf23 --- /dev/null +++ b/app/src/components/TypeManage.vue @@ -0,0 +1,355 @@ + + + + + + 查詢中... + + + + + + + {{ item.text }} + + + + + + + mdi-pencil + + + mdi-delete + + + + + + + + + + 新增類別 + + + + + 新增類別 + + + + + + + + + + + + + + + + + 取消 + + + 新增 + + + + + + + + + + + + + + 修改類別 + + + + + + + + + + + + + + + + + 取消 + + + 修改 + + + + + + + + diff --git a/app/src/router/index.js b/app/src/router/index.js index 9952ce7..760eee1 100644 --- a/app/src/router/index.js +++ b/app/src/router/index.js @@ -7,6 +7,7 @@ import Inventory from '../components/Inventory'; import Search from '../components/Search'; import ServerList from '../components/ServerList'; import account from '../components/AccountManage'; +import type from '../components/TypeManage'; Vue.use(Router); export const constantRoutes = [ @@ -31,6 +32,11 @@ export const constantRoutes = [ component: Inventory }, { + path: 'type', + name: 'type', + component: type + }, + { path: 'search', name: 'search', component: Search diff --git a/src/main/java/com/moze/rms/config/JdbiFactory.java b/src/main/java/com/moze/rms/config/JdbiFactory.java index 5fe3f2c..99f1c7b 100644 --- a/src/main/java/com/moze/rms/config/JdbiFactory.java +++ b/src/main/java/com/moze/rms/config/JdbiFactory.java @@ -80,4 +80,9 @@ public class JdbiFactory { return jdbi.onDemand(SearchDAO.class); } + @Bean + public TypeDAO typeDAO(Jdbi jdbi) { + return jdbi.onDemand(TypeDAO.class); + } + } diff --git a/src/main/java/com/moze/rms/controller/AssertGroupController.java b/src/main/java/com/moze/rms/controller/AssertGroupController.java index 7395bf3..d407542 100644 --- a/src/main/java/com/moze/rms/controller/AssertGroupController.java +++ b/src/main/java/com/moze/rms/controller/AssertGroupController.java @@ -82,6 +82,7 @@ public class AssertGroupController { System.out.println(mappingCol); assertDAO.addColToTable(mappingCol); + assertDAO.sortBeforeInsert(mappingCol.getIndex(), mappingCol.getTablename()); assertDAO.insertColToMappingCol(mappingCol); assertDAO.insertSelectItems(mappingCol); @@ -104,10 +105,11 @@ public class AssertGroupController { } @DeleteMapping("/deleteCol") - public JsonResult deleteCol(@RequestParam String tablename, @RequestParam String colname) { + public JsonResult deleteCol(@RequestParam String tablename, @RequestParam String colname, @RequestParam String index) { assertDAO.deleteColFromTable(tablename, colname); assertDAO.deleteColFromMappingCol(tablename, colname); + assertDAO.sortAfterDelete(index, tablename); assertDAO.deleteFromSelectItem(tablename, colname); return new JsonResult(StatusCode.SUCCESS, null); } diff --git a/src/main/java/com/moze/rms/controller/InventoryController.java b/src/main/java/com/moze/rms/controller/InventoryController.java index 23deed8..d393918 100644 --- a/src/main/java/com/moze/rms/controller/InventoryController.java +++ b/src/main/java/com/moze/rms/controller/InventoryController.java @@ -1,10 +1,7 @@ package com.moze.rms.controller; -import com.moze.rms.dao.InventoryDAO; -import com.moze.rms.dao.MappingColDAO; -import com.moze.rms.dao.MappingTableDAO; -import com.moze.rms.dao.SearchDAO; +import com.moze.rms.dao.*; import com.moze.rms.entity.dto.SelectItemDTO; import com.moze.rms.entity.model.MappingCol; import com.moze.rms.utils.ExcelExpoter; @@ -37,6 +34,9 @@ public class InventoryController { @Autowired SearchDAO searchDAO; + @Autowired + AssertDAO assertDAO; + @GetMapping("/routes") public JsonResult getRoutes() { @@ -142,7 +142,7 @@ public class InventoryController { } ExcelExpoter excelExpoter = new ExcelExpoter(""); String sheetName = mappingTableDAO.findTitle(info.get("tablename")); - excelExpoter.expoerDataExcel(resp, titleKeyList, titleMap, descriptMap, items, info.get("tablename"), sheetName); + excelExpoter.expoerDataExcel(resp, titleKeyList, titleMap, descriptMap, items, info.get("tablename"), sheetName, mappingTableDAO, assertDAO); } @GetMapping("/allHeaders") diff --git a/src/main/java/com/moze/rms/controller/SearchController.java b/src/main/java/com/moze/rms/controller/SearchController.java index 4a91712..c25c813 100644 --- a/src/main/java/com/moze/rms/controller/SearchController.java +++ b/src/main/java/com/moze/rms/controller/SearchController.java @@ -1,6 +1,7 @@ package com.moze.rms.controller; +import com.moze.rms.dao.AssertDAO; import com.moze.rms.dao.MappingColDAO; import com.moze.rms.dao.MappingTableDAO; import com.moze.rms.dao.SearchDAO; @@ -30,6 +31,9 @@ public class SearchController { @Autowired MappingColDAO mappingColDAO; + @Autowired + AssertDAO assertDAO; + @GetMapping("/search") public JsonResult search(@RequestParam String text) { @@ -109,6 +113,6 @@ public class SearchController { } } ExcelExpoter excelExpoter = new ExcelExpoter(""); - excelExpoter.expoerDataExcelMultiSheet(resp, titleKeyLists, titleMaps, descriptMaps, data, "", mappingSheetNames); + excelExpoter.expoerDataExcelMultiSheet(resp, titleKeyLists, titleMaps, descriptMaps, data, "", mappingSheetNames, mappingTableDAO, assertDAO); } } diff --git a/src/main/java/com/moze/rms/controller/TypeController.java b/src/main/java/com/moze/rms/controller/TypeController.java new file mode 100644 index 0000000..8366abe --- /dev/null +++ b/src/main/java/com/moze/rms/controller/TypeController.java @@ -0,0 +1,61 @@ +package com.moze.rms.controller; + + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.moze.rms.dao.AssertDAO; +import com.moze.rms.dao.MappingColDAO; +import com.moze.rms.dao.MappingTableDAO; +import com.moze.rms.dao.TypeDAO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@RestController +@RequestMapping("/api/type") +public class TypeController { + + @Autowired + MappingTableDAO mappingTableDAO; + + @Autowired + AssertDAO assertDAO; + + @Autowired + TypeDAO typeDAO; + + @Autowired + MappingColDAO mappingColDAO; + + @GetMapping("") + JsonResult GetType(@RequestParam String tablename) { + return new JsonResult(StatusCode.SUCCESS, assertDAO.findTypesByTable(tablename)); + } + + @PostMapping("") + JsonResult insertType(@RequestBody Map type) { + typeDAO.sortTypeBeforeInsert( type.get("id").toString(), (String) type.get("tablename")); + typeDAO.insertType(type); + mappingColDAO.insertType(type.get("type") + " " + type.get("name"), type.get("tablename").toString(), type.get("id").toString()); + return new JsonResult(StatusCode.SUCCESS, null); + } + + @PutMapping("") + JsonResult modifyType(@RequestBody Map type) { + if (type.get("id") != type.get("oldId")) { + typeDAO.sortType1( type.get("oldId").toString(), type.get("id").toString(), (String)type.get("tablename")); + typeDAO.sortType2( type.get("oldId").toString(), type.get("id").toString(), (String)type.get("tablename")); + } + typeDAO.updateType(type); + mappingColDAO.updateType(type.get("type").toString(),type.get("type") + " " + type.get("name"), type.get("tablename").toString(), type.get("id").toString()); + return new JsonResult(StatusCode.SUCCESS, null); + } + + @DeleteMapping("") + JsonResult deleteType(@RequestParam String tablename, @RequestParam String id) { + typeDAO.deleteType(tablename, id); + mappingColDAO.deleteType(id, tablename); + typeDAO.sortTypeAfterDelete(id, tablename); + return new JsonResult(StatusCode.SUCCESS, null); + } +} diff --git a/src/main/java/com/moze/rms/dao/AssertDAO.java b/src/main/java/com/moze/rms/dao/AssertDAO.java index 8ee3a49..fecf0aa 100644 --- a/src/main/java/com/moze/rms/dao/AssertDAO.java +++ b/src/main/java/com/moze/rms/dao/AssertDAO.java @@ -27,13 +27,14 @@ public interface AssertDAO extends SqlObject { default List> findTypesByTable(String tablename) { - List> assertGroup = findAssertGroups(); +// List> assertGroup = findAssertGroups(); Handle handle = this.getHandle(); - String sql = "select * from mapping.mapping_" + tablename + " order by type"; + String sql = "select * from mapping.mapping_" + tablename + " order by id"; return handle.createQuery(sql).mapToMap().list(); } + @RegisterBeanMapper(MappingCol.class) @SqlQuery("select * from mapping.mapping_col order by convert(int, [index]);") List findAllCols(); @@ -60,7 +61,11 @@ public interface AssertDAO extends SqlObject { sql += " constraint mapping_" + data.get("assertGroupTablename") + "_pk primary key,"; sql += " name nvarchar(256),"; sql += " descript nvarchar(256),"; - sql += " example nvarchar(256)"; + sql += " example nvarchar(256),"; + sql += " [ ] int,"; + sql += " C int,"; + sql += " I int,"; + sql += " A int"; sql += ")"; handle.createUpdate(sql).execute(); @@ -178,6 +183,9 @@ public interface AssertDAO extends SqlObject { String name2 = name.substring(0, 1).toUpperCase() + name.substring(1); Method method = m.getClass().getMethod("get" + name2); String value = (String) method.invoke(m); + if (value == null) { + value = ""; + } values += "'" + value + "'"; if (i < fields.length - 1) { values += ","; @@ -299,12 +307,24 @@ public interface AssertDAO extends SqlObject { handle.createUpdate(sql).execute(); } + default void sortBeforeInsert(String index, String tablename) { + Handle handle = this.getHandle(); + String sql = "update mapping.mapping_col set [index] = [index] + 1 where [index] >= " + index + " and tablename = '" + tablename + "'"; + handle.createUpdate(sql).execute(); + } + @SqlUpdate("update mapping.mapping_col set [index] = [index] + 1 where [index] < CAST(? as int) and [index] >= CAST(? as int) and tablename = ?") void sortCol1(String oldIndex ,String index, String tablename); @SqlUpdate("update mapping.mapping_col set [index] = [index] - 1 where [index] > CAST(? as int) and [index] <= CAST(? as int) and tablename = ?") void sortCol2(String oldIndex ,String index, String tablename); + default void sortAfterDelete(String index, String tablename) { + Handle handle = this.getHandle(); + String sql = "update mapping.mapping_col set [index] = [index] - 1 where [index] > " + index + " and tablename = '" + tablename + "'"; + handle.createUpdate(sql).execute(); + } + @SqlUpdate("select [index] from mapping.mapping_col where tablename = ? order by [index] desc limit 1;") Integer getLastIndex(String tablename); diff --git a/src/main/java/com/moze/rms/dao/MappingColDAO.java b/src/main/java/com/moze/rms/dao/MappingColDAO.java index 05df81d..bace7e1 100644 --- a/src/main/java/com/moze/rms/dao/MappingColDAO.java +++ b/src/main/java/com/moze/rms/dao/MappingColDAO.java @@ -2,6 +2,8 @@ package com.moze.rms.dao; import com.moze.rms.entity.model.MappingCol; +import org.jdbi.v3.core.Handle; +import org.jdbi.v3.sqlobject.SqlObject; import org.jdbi.v3.sqlobject.config.RegisterBeanMapper; import org.jdbi.v3.sqlobject.statement.SqlQuery; @@ -9,7 +11,7 @@ import java.util.List; import java.util.Map; @RegisterBeanMapper(MappingCol.class) -public interface MappingColDAO { +public interface MappingColDAO extends SqlObject { @SqlQuery("select * from mapping.mapping_col where tablename = ? order by convert(int, [index]);") @@ -18,4 +20,33 @@ public interface MappingColDAO { @SqlQuery("select * from mapping.mapping_col order by convert(int, [index]);") List findAll(); + + + default void insertType(String typeAndName, String tablename, String index) { + Handle handle = this.getHandle(); + String sql = "insert into mapping.selectItem values("; + sql += "'"+ tablename +"',"; + sql += "'type',"; + sql += "'"+ typeAndName +"',"; + sql += index +")"; + handle.createUpdate(sql).execute(); + } + + default void updateType(String type, String typeAndName, String tablename, String index){ + Handle handle = this.getHandle(); + String sql = "update mapping.selectItem set "; + sql += "item = '" + typeAndName + "',"; + sql += "[index] = " + index; + sql += " where item like '" + type + "%' and colname = 'type' and tablename = '" + tablename + "'"; + System.out.println(sql); + handle.createUpdate(sql).execute(); + + } + + default void deleteType(String index, String tablename){ + Handle handle = this.getHandle(); + String sql = "delete from mapping.selectItem where [index] = '" + index + "'"; + handle.createUpdate(sql).execute(); + + } } diff --git a/src/main/java/com/moze/rms/dao/TypeDAO.java b/src/main/java/com/moze/rms/dao/TypeDAO.java new file mode 100644 index 0000000..026917a --- /dev/null +++ b/src/main/java/com/moze/rms/dao/TypeDAO.java @@ -0,0 +1,103 @@ +package com.moze.rms.dao; + +import org.jdbi.v3.core.Handle; +import org.jdbi.v3.sqlobject.SqlObject; +import org.jdbi.v3.sqlobject.statement.SqlUpdate; + +import java.util.Map; + +public interface TypeDAO extends SqlObject { + + + + default void insertType(Map type) { + Handle handle = this.getHandle(); + String sql = "insert into mapping.mapping_" + type.get("tablename"); + + sql += "(type, name, descript, example, C, I, A, id) values ("; + sql += "'" + type.get("type") + "',"; + sql += "'" + type.get("name") + "',"; + sql += "'" + type.get("descript") + "',"; + sql += "'" + type.get("example") + "',"; + if (type.get("c") != "") { + sql += type.get("c") + ","; + } else { + sql += "null,"; + } + if (type.get("i") != "") { + sql += type.get("i") + ","; + } else { + sql += "null,"; + } + if (type.get("a") != "") { + sql += type.get("a") + ","; + } else { + sql += "null,"; + } + sql += type.get("id") + ")"; + + handle.createUpdate(sql).execute(); + } + + default void updateType(Map type) { + Handle handle = this.getHandle(); + String sql = "update mapping.mapping_" + type.get("tablename"); + + sql += " set name = '" + type.get("name") + "',"; + sql += " descript = '" + type.get("descript") + "',"; + sql += "example = '" + type.get("example") + "',"; + if (type.get("c") != "") { + sql += " C = " + type.get("c") + ","; + } else { + sql += " C = null,"; + } + if (type.get("i") != "") { + sql += " I = " + type.get("i") + ","; + } else { + sql += " I = null,"; + } + if (type.get("a") != "") { + sql += " A = " + type.get("a") + ","; + } else { + sql += " A = null,"; + } + sql += " id = " + type.get("id"); + + sql += " where type = '" + type.get("type") + "'"; + + + handle.createUpdate(sql).execute(); + } + + default void deleteType(String tablename, String id) { + Handle handle = this.getHandle(); + String sql = "delete from mapping.mapping_" + tablename + " where id = " + id; + + + handle.createUpdate(sql).execute(); + } + + default void sortTypeBeforeInsert(String id, String tablename) { + Handle handle = this.getHandle(); + String sql = "update mapping.mapping_" + tablename + " set id = id + 1 where id >= " + id; + handle.createUpdate(sql).execute(); + } + + default void sortType1(String oldId ,String id, String tablename) { + Handle handle = this.getHandle(); + String sql = "update mapping.mapping_" + tablename + " set id = id + 1 where id >= " + id + " and id < " + oldId; + handle.createUpdate(sql).execute(); + } + + default void sortType2(String oldId ,String id, String tablename) { + Handle handle = this.getHandle(); + String sql = "update mapping.mapping_" + tablename + " set id = id - 1 where id > " + oldId + " and id <= " + id; + handle.createUpdate(sql).execute(); + } + + default void sortTypeAfterDelete(String id, String tablename) { + Handle handle = this.getHandle(); + String sql = "update mapping.mapping_" + tablename + " set id = id - 1 where id > " + id; + handle.createUpdate(sql).execute(); + } +} diff --git a/src/main/java/com/moze/rms/utils/ExcelExpoter.java b/src/main/java/com/moze/rms/utils/ExcelExpoter.java index 026cbd9..80ee038 100644 --- a/src/main/java/com/moze/rms/utils/ExcelExpoter.java +++ b/src/main/java/com/moze/rms/utils/ExcelExpoter.java @@ -1,8 +1,7 @@ package com.moze.rms.utils; -import java.io.*; -import java.util.*; - +import com.moze.rms.dao.AssertDAO; +import com.moze.rms.dao.MappingTableDAO; import com.moze.rms.entity.model.MappingTable; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; @@ -10,15 +9,17 @@ import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; -import org.apache.poi.ss.util.RegionUtil; -import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.beans.factory.annotation.Autowired; import javax.servlet.http.HttpServletResponse; - +import java.io.IOException; +import java.io.OutputStream; +import java.util.*; public class ExcelExpoter { + private String outputPath; private String nullString; private Set columnAutoSized = new HashSet<>(); @@ -180,11 +181,14 @@ public class ExcelExpoter { } - public void expoerDataExcel(HttpServletResponse response, ArrayList titleKeyList, Map titleMap, Map descriptMap, List> src_list, String filename, String sheetName) throws IOException { + public void expoerDataExcel(HttpServletResponse response, ArrayList titleKeyList, Map titleMap, Map descriptMap, List> src_list, String filename, String sheetName, MappingTableDAO mappingTableDAO, AssertDAO assertDAO) throws IOException { String xlsFile_name = filename + ".xls"; //輸出xls檔名稱 //記憶體中只建立100個物件 Workbook wb = new HSSFWorkbook(); //關鍵語句 + + writeFirstPage( mappingTableDAO, assertDAO, wb); + Sheet sheet = null; //工作表物件 Row nRow = null; //行物件 Cell nCell = null; //列物件 @@ -203,7 +207,7 @@ public class ExcelExpoter { if (rowNo % 300000 == 0) { System.out.println("Current Sheet:" + rowNo / 300000); sheet = wb.createSheet(sheetName);//建立新的sheet物件 - sheet = wb.getSheetAt(rowNo / 300000); //動態指定當前的工作表 + sheet = wb.getSheetAt(rowNo / 300000 + 1); //動態指定當前的工作表 pageRowNo = 0; //新建了工作表,重置工作表的行號為0 // -----------定義表頭----------- nRow = sheet.createRow(pageRowNo++); @@ -212,14 +216,14 @@ public class ExcelExpoter { Cell cell_tem_title = nRow.createCell(0); cell_tem_title.setCellStyle(titleStyle); cell_tem_title.setCellValue("資訊資產清冊 " + sheetName + "類"); - CellRangeAddress cra =new CellRangeAddress(0, 0, 0, titleKeyList.size() - 1); + CellRangeAddress cra = new CellRangeAddress(0, 0, 0, titleKeyList.size() - 1); sheet.addMergedRegion(cra); rowNo++; nRow = sheet.createRow(pageRowNo++); HSSFCellStyle headerStyle = (HSSFCellStyle) wb.createCellStyle(); headerStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.DARK_BLUE.getIndex()); headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); - HSSFFont headerFont= (HSSFFont) wb.createFont(); + HSSFFont headerFont = (HSSFFont) wb.createFont(); headerFont.setColor(HSSFColor.HSSFColorPredefined.WHITE.getIndex()); headerStyle.setFont(headerFont); headerStyle.setBorderBottom(BorderStyle.THIN); @@ -241,7 +245,7 @@ public class ExcelExpoter { HSSFCellStyle descriptStyle = (HSSFCellStyle) wb.createCellStyle(); descriptStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.LIGHT_CORNFLOWER_BLUE.getIndex()); descriptStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); - HSSFFont descriptFont= (HSSFFont) wb.createFont(); + HSSFFont descriptFont = (HSSFFont) wb.createFont(); descriptFont.setColor(HSSFColor.HSSFColorPredefined.RED.getIndex()); descriptStyle.setFont(descriptFont); descriptStyle.setBorderBottom(BorderStyle.THIN); @@ -266,15 +270,15 @@ public class ExcelExpoter { nCell = nRow.createCell(j); nCell.setCellStyle(dataStyle); if (srcMap.get(titleKeyList.get(j)) != null) { - nCell.setCellValue(srcMap.get(titleKeyList.get(j)).toString()); + nCell.setCellValue(srcMap.get(titleKeyList.get(j)).toString().replaceAll("\\?", "")); } else { nCell.setCellValue(""); } } } response.setContentType("application/vnd.ms-excel;charset=utf-8"); - response.setHeader("filename" , xlsFile_name); - response.setHeader("Content-disposition" , "attachment;filename=" + xlsFile_name); + response.setHeader("filename", xlsFile_name); + response.setHeader("Content-disposition", "attachment;filename=" + xlsFile_name); response.flushBuffer(); OutputStream outputStream = response.getOutputStream(); wb.write(response.getOutputStream()); @@ -284,20 +288,24 @@ public class ExcelExpoter { } - public void expoerDataExcelMultiSheet(HttpServletResponse response, Map> titleKeyLists, Map> titleMaps, Map> descriptMaps, Map>> src_lists, String filename, Map sheetNames) throws IOException { + public void expoerDataExcelMultiSheet(HttpServletResponse response, Map> titleKeyLists, Map> titleMaps, Map> descriptMaps, Map>> src_lists, String filename, Map sheetNames, MappingTableDAO mappingTableDAO, AssertDAO assertDAO) throws IOException { String xlsFile_name = "SeverList.xls"; //輸出xls檔名稱 //記憶體中只建立100個物件 Workbook wb = new HSSFWorkbook(); //關鍵語句 + + writeFirstPage( mappingTableDAO, assertDAO, wb); + + // Iterator>>> iterator = src_lists.entrySet().iterator(); Iterator> iterator = sheetNames.entrySet().iterator(); while (iterator.hasNext()) { - Sheet sheet = null; //工作表物件 - Row nRow = null; //行物件 - Cell nCell = null; //列物件 + Sheet sheet = null; //工作表物件 + Row nRow = null; //行物件 + Cell nCell = null; //列物件 - int rowNo = 0; //總行號 - int pageRowNo = 0; //頁行號 + int rowNo = 0; //總行號 + int pageRowNo = 0; //頁行號 Map.Entry next = iterator.next(); @@ -325,14 +333,14 @@ public class ExcelExpoter { Cell cell_tem_title = nRow.createCell(0); cell_tem_title.setCellStyle(titleStyle); cell_tem_title.setCellValue("資訊資產清冊 " + sheetNames.get(key) + "類"); - CellRangeAddress cra =new CellRangeAddress(0, 0, 0, titleKeyLists.get(key).size() - 1); + CellRangeAddress cra = new CellRangeAddress(0, 0, 0, titleKeyLists.get(key).size() - 1); sheet.addMergedRegion(cra); rowNo++; nRow = sheet.createRow(pageRowNo++); HSSFCellStyle headerStyle = (HSSFCellStyle) wb.createCellStyle(); headerStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.DARK_BLUE.getIndex()); headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); - HSSFFont headerFont= (HSSFFont) wb.createFont(); + HSSFFont headerFont = (HSSFFont) wb.createFont(); headerFont.setColor(HSSFColor.HSSFColorPredefined.WHITE.getIndex()); headerStyle.setFont(headerFont); headerStyle.setBorderBottom(BorderStyle.THIN); @@ -354,7 +362,7 @@ public class ExcelExpoter { HSSFCellStyle descriptStyle = (HSSFCellStyle) wb.createCellStyle(); descriptStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.LIGHT_CORNFLOWER_BLUE.getIndex()); descriptStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); - HSSFFont descriptFont= (HSSFFont) wb.createFont(); + HSSFFont descriptFont = (HSSFFont) wb.createFont(); descriptFont.setColor(HSSFColor.HSSFColorPredefined.RED.getIndex()); descriptStyle.setFont(descriptFont); descriptStyle.setBorderBottom(BorderStyle.THIN); @@ -379,7 +387,7 @@ public class ExcelExpoter { nCell = nRow.createCell(j); nCell.setCellStyle(dataStyle); if (srcMap.get(titleKeyLists.get(key).get(j)) != null) { - nCell.setCellValue(srcMap.get(titleKeyLists.get(key).get(j)).toString()); + nCell.setCellValue(srcMap.get(titleKeyLists.get(key).get(j)).toString().replaceAll("\\?", "")); } else { nCell.setCellValue(""); } @@ -394,14 +402,206 @@ public class ExcelExpoter { } response.setContentType("application/vnd.ms-excel;charset=utf-8"); - response.setHeader("filename" ,xlsFile_name); - response.setHeader("Content-disposition" ,"attachment;filename="+xlsFile_name); + response.setHeader("filename", xlsFile_name); + response.setHeader("Content-disposition", "attachment;filename=" + xlsFile_name); response.flushBuffer(); - OutputStream outputStream = response.getOutputStream(); + OutputStream outputStream = response.getOutputStream(); wb.write(response.getOutputStream()); wb.close(); outputStream.flush(); outputStream.close(); -} + } + + public void writeFirstPage(MappingTableDAO mappingTableDAO, AssertDAO assertDAO, Workbook wb) { + + Sheet sheet = null; //工作表物件 + Row nRow = null; //行物件 + Cell nCell = null; + + int pageRowNo = 0; + + sheet = wb.createSheet("資訊資產群組"); + + nRow = sheet.createRow(pageRowNo++); + HSSFCellStyle titleStyle = (HSSFCellStyle) wb.createCellStyle(); + + HSSFFont titleFont = (HSSFFont) wb.createFont(); + titleFont.setBold(true); + titleStyle.setFont(titleFont); + titleStyle.setAlignment(HorizontalAlignment.CENTER); + + + Cell cell_tem_title = nRow.createCell(0); + cell_tem_title.setCellStyle(titleStyle); + cell_tem_title.setCellValue("資訊資產清冊分級建議"); + CellRangeAddress cra = new CellRangeAddress(0, 0, 0, 7); + sheet.addMergedRegion(cra); + nRow = sheet.createRow(pageRowNo++); + + HSSFFont headerFont = (HSSFFont) wb.createFont(); + headerFont.setColor(HSSFColor.HSSFColorPredefined.WHITE.getIndex()); + + + HSSFCellStyle headerStartStyle = (HSSFCellStyle) wb.createCellStyle(); + headerStartStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.AQUA.getIndex()); + headerStartStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + headerStartStyle.setFont(headerFont); + headerStartStyle.setBorderBottom(BorderStyle.MEDIUM); + headerStartStyle.setBorderLeft(BorderStyle.MEDIUM); + headerStartStyle.setBorderTop(BorderStyle.MEDIUM); + headerStartStyle.setVerticalAlignment(VerticalAlignment.TOP); + + HSSFCellStyle headerEndStyle = (HSSFCellStyle) wb.createCellStyle(); + headerEndStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.AQUA.getIndex()); + headerEndStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + headerEndStyle.setFont(headerFont); + headerEndStyle.setBorderBottom(BorderStyle.MEDIUM); + headerEndStyle.setBorderTop(BorderStyle.MEDIUM); + headerEndStyle.setBorderRight(BorderStyle.MEDIUM); + headerEndStyle.setVerticalAlignment(VerticalAlignment.TOP); + + + HSSFCellStyle headerStyle = (HSSFCellStyle) wb.createCellStyle(); + headerStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.AQUA.getIndex()); + headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + headerStyle.setFont(headerFont); + headerStyle.setBorderBottom(BorderStyle.MEDIUM); + headerStyle.setBorderTop(BorderStyle.MEDIUM); + headerStyle.setVerticalAlignment(VerticalAlignment.TOP); + + Cell cell_tem0 = nRow.createCell(0); + cell_tem0.setCellValue("項次"); + cell_tem0.setCellStyle(headerStartStyle); + Cell cell_tem1 = nRow.createCell(1); + cell_tem1.setCellValue("分類"); + cell_tem1.setCellStyle(headerStyle); + Cell cell_tem2 = nRow.createCell(2); + cell_tem2.setCellValue("說明"); + cell_tem2.setCellStyle(headerStyle); + Cell cell_tem3 = nRow.createCell(3); + cell_tem3.setCellValue("範例"); + cell_tem3.setCellStyle(headerEndStyle); + Cell cell_tem4 = nRow.createCell(4); + cell_tem3.setCellValue(""); + Cell cell_tem5 = nRow.createCell(5); + cell_tem5.setCellValue("C"); + cell_tem5.setCellStyle(headerStartStyle); + Cell cell_tem6 = nRow.createCell(6); + cell_tem6.setCellValue("I"); + cell_tem6.setCellStyle(headerStyle); + Cell cell_tem7 = nRow.createCell(7); + cell_tem7.setCellValue("A"); + cell_tem7.setCellStyle(headerEndStyle); + + sheet.setColumnWidth(1, 4500); + sheet.setColumnWidth(2, 4500); + sheet.setColumnWidth(3, 4500); + sheet.setColumnWidth(4, 900); + sheet.setColumnWidth(5, 900); + sheet.setColumnWidth(6, 900); + sheet.setColumnWidth(7, 900); + + sheet.createFreezePane(0, 2); + + HSSFCellStyle subheaderStartStyle = (HSSFCellStyle) wb.createCellStyle(); + subheaderStartStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.DARK_TEAL.getIndex()); + subheaderStartStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + subheaderStartStyle.setFont(headerFont); + subheaderStartStyle.setBorderBottom(BorderStyle.MEDIUM); + subheaderStartStyle.setBorderLeft(BorderStyle.MEDIUM); + subheaderStartStyle.setBorderTop(BorderStyle.MEDIUM); + subheaderStartStyle.setVerticalAlignment(VerticalAlignment.TOP); + + HSSFCellStyle subheaderEndStyle = (HSSFCellStyle) wb.createCellStyle(); + subheaderEndStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.DARK_TEAL.getIndex()); + subheaderEndStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + subheaderEndStyle.setFont(headerFont); + subheaderEndStyle.setBorderBottom(BorderStyle.MEDIUM); + subheaderEndStyle.setBorderTop(BorderStyle.MEDIUM); + subheaderEndStyle.setBorderRight(BorderStyle.MEDIUM); + subheaderEndStyle.setVerticalAlignment(VerticalAlignment.TOP); + + + HSSFCellStyle subheaderStyle = (HSSFCellStyle) wb.createCellStyle(); + subheaderStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.DARK_TEAL.getIndex()); + subheaderStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + subheaderStyle.setFont(headerFont); + subheaderStyle.setBorderBottom(BorderStyle.MEDIUM); + subheaderStyle.setBorderTop(BorderStyle.MEDIUM); + subheaderStyle.setVerticalAlignment(VerticalAlignment.TOP); + + List mappingTables = mappingTableDAO.findAll(); + for (MappingTable mappingTable : mappingTables) { + List> datas = assertDAO.findTypesByTable(mappingTable.getTablename()); + + nRow = sheet.createRow(pageRowNo++); + Cell cell_subheader0 = nRow.createCell(0); + cell_subheader0.setCellStyle(subheaderStartStyle); + cell_subheader0.setCellValue(mappingTable.getDescript() + "類"); + Cell cell_subheader1 = nRow.createCell(1); + cell_subheader1.setCellStyle(subheaderStyle); + Cell cell_subheader2 = nRow.createCell(2); + cell_subheader2.setCellStyle(subheaderStyle); + Cell cell_subheader3 = nRow.createCell(3); + cell_subheader3.setCellStyle(subheaderEndStyle); + Cell cell_subheader4 = nRow.createCell(4); + Cell cell_subheader5 = nRow.createCell(5); +// cell_subheader5.setCellStyle(subheaderStartStyle); + Cell cell_subheader6 = nRow.createCell(6); +// cell_subheader6.setCellStyle(subheaderStyle); + Cell cell_subheader7 = nRow.createCell(7); +// cell_subheader7.setCellStyle(subheaderEndStyle); + + HSSFCellStyle valStyle = (HSSFCellStyle) wb.createCellStyle(); + valStyle.setBorderRight(BorderStyle.THIN); + valStyle.setBorderLeft(BorderStyle.THIN); + valStyle.setBorderBottom(BorderStyle.THIN); + valStyle.setBorderTop(BorderStyle.THIN); + valStyle.setVerticalAlignment(VerticalAlignment.TOP); + valStyle.setWrapText(true); + + for (Map data : datas) { + nRow = sheet.createRow(pageRowNo++); + Cell cell_val0 = nRow.createCell(0); + cell_val0.setCellValue(data.get("type").toString()); + cell_val0.setCellStyle(valStyle); + Cell cell_val1 = nRow.createCell(1); + cell_val1.setCellValue(data.get("name").toString()); + cell_val1.setCellStyle(valStyle); + Cell cell_val2 = nRow.createCell(2); + cell_val2.setCellValue(data.get("descript").toString()); + cell_val2.setCellStyle(valStyle); + Cell cell_val3 = nRow.createCell(3); + cell_val3.setCellValue(data.get("example").toString()); + cell_val3.setCellStyle(valStyle); + Cell cell_val4 = nRow.createCell(4); + Cell cell_val5 = nRow.createCell(5); + if (data.get("c") != null) { + cell_subheader5.setCellStyle(subheaderStartStyle); + cell_val5.setCellStyle(valStyle); + cell_subheader5.setCellValue("C"); + cell_val5.setCellValue(data.get("c").toString()); + } + Cell cell_val6 = nRow.createCell(6); + if (data.get("i") != null) { + cell_subheader6.setCellStyle(subheaderStyle); + cell_val6.setCellStyle(valStyle); + cell_subheader6.setCellValue("I"); + cell_val6.setCellValue(data.get("i").toString()); + } + Cell cell_val7 = nRow.createCell(7); + if (data.get("a") != null) { + cell_subheader7.setCellStyle(subheaderEndStyle); + cell_val7.setCellStyle(valStyle); + cell_subheader7.setCellValue("A"); + cell_val7.setCellValue(data.get("a").toString()); + } + } + + pageRowNo++; + } + + + } } \ No newline at end of file
{{item.level === '0' ? '超級管理員' : ''}}
{{item.level === '1' ? '一般管理員' : ''}}