[功能集锦] 002 - mysql查询数据库字典+导出+样式一键整合至excel
Posted 如然
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[功能集锦] 002 - mysql查询数据库字典+导出+样式一键整合至excel相关的知识,希望对你有一定的参考价值。
写在前面:
因为工作时候经常遇到半路接手项目的情况,由于年代久远,数据库字典这块经常缺失。故写此篇,以便复用,也希望对大家有点帮助。
随笔内容不高级,如有不妥,不吝指正。
20190730-加了一些简单样式,生成的excel文件,只需要人为操作设置列宽度自适应,样式就基本ok了;
------------------------------------------------------------分-割-线------------------------------------------------------------
第一步:查询数据库
查询语句:
SELECT pretab.TABLE_NAME AS 表名,pretab.TABLE_COMMENT AS 表释义,precol.COLUMN_NAME AS 字段名,precol.COLUMN_TYPE AS 字段类型,precol.COLUMN_DEFAULT AS 字段默认值,precol.COLUMN_COMMENT AS 表字段释义 FROM information_schema.`TABLES` AS pretab RIGHT JOIN information_schema.`COLUMNS` AS precol ON precol.TABLE_NAME=pretab.TABLE_NAME WHERE pretab.TABLE_SCHEMA ="此处填写库名" GROUP BY precol.TABLE_NAME,precol.COLUMN_NAME ORDER BY precol.TABLE_NAME;
结果图示:
第二步:导出查询结果
导出txt:
导出结果:
第三步:一键整合至excel
运行下方代码:
1 import java.io.BufferedReader; 2 import java.io.FileInputStream; 3 import java.io.FileOutputStream; 4 import java.io.InputStreamReader; 5 import java.util.HashMap; 6 import java.util.Map; 7 import java.util.Set; 8 9 import org.apache.commons.collections4.MapUtils; 10 import org.apache.poi.hssf.usermodel.HSSFCell; 11 import org.apache.poi.hssf.usermodel.HSSFRow; 12 import org.apache.poi.hssf.usermodel.HSSFSheet; 13 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 14 import org.apache.poi.ss.usermodel.CellStyle; 15 import org.apache.poi.ss.usermodel.FillPatternType; 16 import org.apache.poi.ss.usermodel.Font; 17 import org.apache.poi.ss.usermodel.HorizontalAlignment; 18 import org.apache.poi.ss.usermodel.IndexedColors; 19 import org.apache.poi.ss.usermodel.VerticalAlignment; 20 import org.apache.poi.ss.usermodel.Workbook; 21 import org.apache.poi.ss.util.CellRangeAddress; 22 import org.apache.poi.xssf.usermodel.XSSFCell; 23 import org.apache.poi.xssf.usermodel.XSSFRow; 24 import org.apache.poi.xssf.usermodel.XSSFSheet; 25 import org.apache.poi.xssf.usermodel.XSSFWorkbook; 26 27 /** 28 * 生成数据库数据结构速查文件(数据库字典) 29 * 30 * @author ruran 31 * @since 2019年7月4日 下午3:25:13 32 */ 33 public class ProduceGuideOfDatabase { 34 35 /* 36 * 数据来源 37 * 38 * SELECT pretab.TABLE_NAME AS 表名,pretab.TABLE_COMMENT AS 表释义, 39 * precol.COLUMN_NAME AS 字段名,precol.COLUMN_TYPE AS 字段类型, 40 * precol.COLUMN_DEFAULT AS 字段默认值,precol.COLUMN_COMMENT AS 表字段释义 FROM 41 * information_schema.`TABLES` AS pretab RIGHT JOIN 42 * information_schema.`COLUMNS` AS precol ON 43 * precol.TABLE_NAME=pretab.TABLE_NAME WHERE pretab.TABLE_SCHEMA ="此处填写库名" 44 * GROUP BY precol.TABLE_NAME,precol.COLUMN_NAME ORDER BY precol.TABLE_NAME; 45 */ 46 public static void main(String[] args) { 47 System.out.println("开始运行程序。。。"); 48 long preTime = System.currentTimeMillis(); 49 // navicat导出txt-程序整理生成字典文件(人工参与步骤多,繁琐,不智能) 50 reArrangeFromSQLtxt(); 51 System.out.println("运行完成,耗时:" + (System.currentTimeMillis() - preTime) + "ms"); 52 } 53 54 /** 55 * 从TXT文件中重整成excel 56 * 57 * @author ruran 58 * @since 2019年7月24日 下午4:40:10 59 */ 60 private static void reArrangeFromSQLtxt() { 61 String url = "F:\\\\2-ME\\\\中心+部门\\\\1-scrs学习整理区\\\\数据库字典整理\\\\"; 62 String[] fromFiles = "scrssit-scrssit2-scrssit3-scrssit4-scrssit5-scrssit6-scrssit7-scrssit8-scrssit9-scrssit10-scrssit11" 63 .split("-"); 64 String forFile = "系统数据库结构参考速查表-20190724.xlsx"; 65 Map<String, Map<String, TablePojo>> database_tables = reDataFromSQLtxt(url, fromFiles, "@"); 66 if (MapUtils.isNotEmpty(database_tables)) { 67 if (forFile.contains(".xlsx")) { 68 arrangeToXLSX(database_tables, url, forFile); 69 } else { 70 arrangeToXLS(database_tables, url, forFile); 71 } 72 } 73 } 74 75 /** 76 * 整理数据库字典 77 * 78 * 可防止分表多次输出 79 * 80 * @author ruran 81 * @since 2019年7月22日 下午2:06:54 82 * @param url 83 * @param fileName 84 * @param splitStr 85 */ 86 private static Map<String, Map<String, TablePojo>> reDataFromSQLtxt(String url, String[] fromFileNames, 87 String splitStr) { 88 Map<String, Map<String, TablePojo>> database_table = new HashMap<>(); 89 for (String fromFileName : fromFileNames) { 90 try (FileInputStream fis = new FileInputStream(url + fromFileName + ".txt"); 91 InputStreamReader isr = new InputStreamReader(fis); 92 BufferedReader br = new BufferedReader(isr);) { 93 String readLine = ""; 94 String columnLines = ""; 95 int countAll = 0;// 表总数 96 Map<String, TablePojo> tableNames = new HashMap<>(); 97 String preTableName = ""; 98 String preTableComment = ""; 99 while (isNotBlank((readLine = br.readLine()))) { 100 String[] lineSplit = readLine.split(splitStr); 101 int lineSplitLenght = lineSplit.length; 102 String currentTableName = ""; 103 if (lineSplitLenght > 0) { 104 currentTableName = lineSplit[0]; 105 } 106 if (tableNames.containsKey(getRealTablename(currentTableName))) { 107 continue; 108 } 109 String currentTableComment = ""; 110 String currentColumnName = ""; 111 String currentColumnType = ""; 112 String currentColumnDefault = ""; 113 String currentColumnComment = ""; 114 if (lineSplitLenght > 1) { 115 currentTableComment = lineSplit[1]; 116 } 117 if (lineSplitLenght > 2) { 118 currentColumnName = lineSplit[2]; 119 } 120 if (lineSplitLenght > 3) { 121 currentColumnType = lineSplit[3]; 122 } 123 if (lineSplitLenght > 4) { 124 currentColumnDefault = lineSplit[4]; 125 } 126 if (lineSplitLenght > 5) { 127 currentColumnComment = lineSplit[5]; 128 } 129 if (currentTableName.equals(preTableName)) { 130 columnLines += currentColumnName + "#" + currentColumnType + "#" + currentColumnDefault + "#" 131 + currentColumnComment + "@"; 132 continue; 133 } 134 if (countAll != 0 && !tableNames.containsKey(getRealTablename(preTableName))) { 135 TablePojo tablePojo = new TablePojo(preTableName, preTableComment, columnLines.substring(0, 136 columnLines.length() - 1)); 137 tableNames.put(getRealTablename(preTableName), tablePojo); 138 } 139 countAll++; 140 columnLines = currentColumnName + "#" + currentColumnType + "#" + currentColumnDefault + "#" 141 + currentColumnComment + "@"; 142 preTableName = currentTableName; 143 preTableComment = currentTableComment; 144 } 145 // 最后一组数据判断+保存 146 if (!tableNames.containsKey(getRealTablename(preTableName))) { 147 TablePojo tablePojo = new TablePojo(preTableName, preTableComment, columnLines.substring(0, 148 columnLines.length() - 1)); 149 tableNames.put(getRealTablename(preTableName), tablePojo); 150 } 151 database_table.put(fromFileName, tableNames); 152 } catch (Exception e) { 153 e.printStackTrace(); 154 continue; 155 } 156 } 157 return database_table; 158 } 159 160 /** 161 * 取数据整合到excel-xls 162 * 163 * @author ruran 164 * @since 2019年7月23日 下午5:32:50 165 * @param tableNamesMap 166 * @param fos 167 */ 168 private static void arrangeToXLS(Map<String, Map<String, TablePojo>> database_tables, String url, String forFile) { 169 try (FileOutputStream fos = new FileOutputStream(url + forFile);) { 170 if (MapUtils.isNotEmpty(database_tables)) { 171 HSSFWorkbook currentWorkbook = new HSSFWorkbook(); 172 // 获取所有样式 173 Map<String, CellStyle> cellStyles = getCellStyles(currentWorkbook); 174 Set<String> databaseNames = database_tables.keySet(); 175 for (String databaseName : databaseNames) { 176 HSSFSheet currentSheet = currentWorkbook.createSheet(databaseName); 177 HSSFRow currentRow = null; 178 HSSFCell currentCell = null; 179 int rowIndex = -1; 180 Map<String, TablePojo> tableNames = database_tables.get(databaseName); 181 for (TablePojo tablePojo : tableNames.values()) { 182 // 空行 183 currentSheet.createRow(++rowIndex); 184 // 表头 185 currentRow = currentSheet.createRow(++rowIndex); 186 currentRow.setHeightInPoints(18); 187 currentCell = currentRow.createCell(0); 188 currentCell.setCellStyle(cellStyles.get("bluesStyle")); 189 currentCell.setCellValue(tablePojo.getTableName() + "(" + tablePojo.getTableComment() + ")"); 190 CellRangeAddress region = new CellRangeAddress(rowIndex, rowIndex, 0, 3); 191 currentSheet.addMergedRegion(region); 192 // 表-标题栏 193 currentRow = currentSheet.createRow(++rowIndex); 194 currentRow.setHeightInPoints(18); 195 currentCell = currentRow.createCell(0); 196 currentCell.setCellStyle(cellStyles.get("blueStyle")); 197 currentCell.setCellValue("列名"); 198 currentCell = currentRow.createCell(1); 199 currentCell.setCellStyle(cellStyles.get("blueStyle")); 200 currentCell.setCellValue("类型"); 201 currentCell = currentRow.createCell(2); 202 currentCell.setCellStyle(cellStyles.get("blueStyle")); 203 currentCell.setCellValue("默认值"); 204 currentCell = currentRow.createCell(3); 205 currentCell.setCellStyle(cellStyles.get("blueStyle")); 206 currentCell.setCellValue("释义"); 207 // 表字段 208 String tableColumnsStr = tablePojo.getTableColumns(); 209 for (String tableColumns : tableColumnsStr.split("@")) { 210 currentRow = currentSheet.createRow(++rowIndex); 211 currentRow.setHeightInPoints(18); 212 String[] tableColumnArr = tableColumns.split("#"); 213 for (int i = 0; i < tableColumnArr.length; i++) { 214 currentCell = currentRow.createCell(i); 215 currentCell.setCellStyle(cellStyles.get("baseStyle")); 216 currentCell.setCellValue(tableColumnArr[i]); 217 } 218 } 219 } 220 } 221 currentWorkbook.write(fos); 222 } 223 } catch (Exception e) { 224 e.printStackTrace(); 225 } 226 } 227 228 /** 229 * 取数据整合到excel-xlsx 230 * 231 * @author ruran 232 * @since 2019年7月24日 上午11:51:56 233 * @param tableNamesMap 234 * @param fos 235 */ 236 private static void arrangeToXLSX(Map<String, Map<String, TablePojo>> database_tables, String url, String forFile) { 237 try (FileOutputStream fos = new FileOutputStream(url + forFile);) { 238 if (MapUtils.isNotEmpty(database_tables)) { 239 XSSFWorkbook currentWorkbook = new XSSFWorkbook(); 240 // 获取所有样式 241 Map<String, CellStyle> cellStyles = getCellStyles(currentWorkbook); 242 Set<String> databaseNames = database_tables.keySet(); 243 for (String databaseName : databaseNames) { 244 XSSFSheet currentSheet = currentWorkbook.createSheet(databaseName); 245 XSSFRow currentRow = null; 246 XSSFCell currentCell = null; 247 int rowIndex = -1; 248 Map<String, TablePojo> tableNames = database_tables.get(databaseName); 249 for (TablePojo tablePojo : tableNames.values()) { 250 // 空行 251 currentSheet.createRow(++rowIndex); 252 // 表头 253 currentRow = currentSheet.createRow(++rowIndex); 254 currentRow.setHeightInPoints(18); 255 currentCell = currentRow.createCell(0); 256 currentCell.setCellStyle(cellStyles.get("bluesStyle")); 257 currentCell.setCellValue(tablePojo.getTableName() + "(" + tablePojo.getTableComment() + ")"); 258 CellRangeAddress region = new CellRangeAddress(rowIndex, rowIndex, 0, 3); 259 currentSheet.addMergedRegion(region); 260 // 表-标题栏 261 currentRow = currentSheet.createRow(++rowIndex); 262 currentRow.setHeightInPoints(18); 263 currentCell = currentRow.createCell(0); 264 currentCell.setCellStyle(cellStyles.get("blueStyle")); 265 currentCell.setCellValue("列名"); 266 currentCell = currentRow.createCell(1); 267 currentCell.setCellStyle(cellStyles.get("blueStyle")); 268 currentCell.setCellValue("类型"); 269 currentCell = currentRow.createCell(2); 270 currentCell.setCellStyle(cellStyles.get("blueStyle")); 271 currentCell.setCellValue("默认值"); 272 currentCell = currentRow.createCell(3); 273 currentCell.setCellStyle(cellStyles.get("blueStyle")); 274 currentCell.setCellValue("释义"); 275 // 表字段 276 String tableColumnsStr = tablePojo.getTableColumns(); 277 for (String tableColumns : tableColumnsStr.split("@")) { 278 currentRow = currentSheet.createRow(++rowIndex); 279 currentRow.setHeightInPoints(18); 280 String[] tableColumnArr = tableColumns.split("#"); 281 for (int i = 0; i < tableColumnArr.length; i++) { 282 currentCell = currentRow.createCell(i); 283 currentCell.setCellStyle(cellStyles.get("baseStyle")); 284 currentCell.setCellValue(tableColumnArr[i]); 285 } 286 } 287 } 288 } 289 currentWorkbook.write(fos); 290 } 291 } catch (Exception e) { 292 e.printStackTrace(); 293 } 294 } 295 296 /** 297 * 样式集锦 298 * 299 * @author ruran 300 * @since 2019年7月24日 下午7:32:26 301 * @param workbook 302 * @return 303 */ 304 private static Map<String, CellStyle> getCellStyles(Workbook workbook) { 305 // 实线边框 306 // style1.setBorderTop(BorderStyle.THIN); 307 // style1.setBorderBottom(BorderStyle.THIN); 308 // style1.setBorderLeft(BorderStyle.THIN); 309 // style1.setBorderRight(BorderStyle.THIN); 310 // 设置自动换行 311 // baseStyle.setWrapText(true); 312 313 Map<String, CellStyle> cellStylesMap = new HashMap<>(); 314 // baseStyle 315 CellStyle baseStyle = workbook.createCellStyle(); 316 // 水平对齐方式 317 baseStyle.setAlignment(HorizontalAlignment.LEFT); 318 // 垂直对齐方式 319 baseStyle.setVerticalAlignment(VerticalAlignment.CENTER); 320 // 宋体设置 321 Font baseFont = workbook.createFont(); 322 baseFont.setFontName("宋体"); 323 baseStyle.setFont(baseFont); 324 cellStylesMap.put("baseStyle", baseStyle);// 存放样式-baseStyle 325 326 // 深蓝色底部、白色字体、加粗 327 CellStyle bluesStyle = workbook.createCellStyle(); 328 bluesStyle.cloneStyleFrom(cellStylesMap.get("baseStyle"));// 继承某样式 329 // 背景色 330 bluesStyle.setFillForegroundColor(IndexedColors.ROYAL_BLUE.getIndex()); 331 bluesStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 这一行是必须的,不然会得不到想要的结果 332 // 白色加粗字体 333 Font bluesFont = workbook.createFont(); 334 bluesFont.setColor(IndexedColors.WHITE.getIndex()); 335 bluesFont.setBold(true); 336 bluesFont.setFontName("宋体"); 337 bluesStyle.setFont(bluesFont); 338 cellStylesMap.put("bluesStyle", bluesStyle);// 存放样式-bluesStyle 339 340 // 浅蓝色底部 341 CellStyle blueStyle = workbook.createCellStyle(); 342 blueStyle.cloneStyleFrom(cellStylesMap.get("baseStyle"));// 继承某样式 343 // 背景色 344 blueStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex()); 345 blueStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 这一行是必须的,不然会得不到想要的结果 346 cellStylesMap.put("blueStyle", blueStyle);// 存放样式-blueStyle 347 348 return cellStylesMap; 349 } 350 351 /** 352 * 字符串判非空 353 * 354 * @author ruran 355 * @since 2019年7月23日 下午2:29:38 356 * @param str 357 * @return 358 */ 359 private static boolean isNotBlank(String str) { 360 if (null == str) { 361 return false; 362 } 363 if (str.trim().length() == 0) { 364 return false; 365 } 366 return true; 367 } 368 369 /** 370 * 字符串判非空 以上是关于[功能集锦] 002 - mysql查询数据库字典+导出+样式一键整合至excel的主要内容,如果未能解决你的问题,请参考以下文章