package com.enjoyit.pos.common.util;
import com.enjoyit.pos.common.CommonLog;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.RegionUtil;
import org.apache.poi.xssf.usermodel.*;
import java.io.FileOutputStream;
import java.util.List;
/**
* <dependency>
* <groupId>org.apache.poi</groupId>
* <artifactId>poi-ooxml-schemas</artifactId>
* <version>4.1.1</version>
* </dependency>
*
* <dependency>
* <groupId>org.apache.commons</groupId>
* <artifactId>commons-collections4</artifactId>
* <version>4.1</version>
* </dependency>
* <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
* <dependency>
* <groupId>org.apache.poi</groupId>
* <artifactId>poi-ooxml</artifactId>
* <version>4.1.1</version>
* </dependency>
* <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
* <dependency>
* <groupId>org.apache.poi</groupId>
* <artifactId>poi</artifactId>
* <version>4.1.1</version>
* </dependency>
*/
public class PosExcelUtilXlsx {
/**
* 数据写入
*
* @param title 表格标题
* @param colHead 列头(表头)
* @param dataList 数据列表
* @return 返回表格
*/
public <T> XSSFWorkbook createExcel(String title, String[] colHead, List<Object[]> dataList) {
// 创建一个表格
XSSFWorkbook wb = new XSSFWorkbook();
// 创建工作页并赋名
XSSFSheet sheet = wb.createSheet("Sheet1");
// 创建标题
XSSFRow titleRow = sheet.createRow(0);
XSSFCell titleCell = titleRow.createCell(0);
// 设置标题高度
titleRow.setHeight((short) (20 * 25));
// 给标题设置样式
XSSFCellStyle titleStyle = this.getTitleStyle(wb);
// 给列头(表头)设置样式
XSSFCellStyle colHeadStyle = this.getColHeadStyle(wb);
// 给数据列表设置样式
XSSFCellStyle dataListStyle = this.getDataListStyle(wb);
// 合并单元格 起始行 截至列 起始列 截至行
// sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, dataList.get(0).length - 1));
CellRangeAddress titleMerge = new CellRangeAddress(0, 0, 0, dataList.get(0).length - 1);
sheet.addMergedRegion(titleMerge);
RegionUtil.setBorderTop(BorderStyle.THIN, titleMerge, sheet);
RegionUtil.setBorderRight(BorderStyle.THIN, titleMerge, sheet);
// 给标题样式附上
titleCell.setCellStyle(titleStyle);
// 给标题赋值
titleCell.setCellValue(title);
// 创建表头行
XSSFRow colHeadRow = sheet.createRow(1);
// 设置表头行高度
colHeadRow.setHeight((short) (15 * 20));
// 给表头设置样式并赋值
for (int i = 0; i < colHead.length; i++) {
XSSFCell colHeadCell = colHeadRow.createCell(i);
colHeadCell.setCellStyle(colHeadStyle);
colHeadCell.setCellValue(colHead[i]);
}
// 将查询到的数据赋到列表
for (int i = 0; i < dataList.size(); i++) {
// 获取每一行的元素
Object[] data = dataList.get(i);
// 创建行
XSSFRow dataRow = sheet.createRow(i + 2);
// 循环当前行的列元素设置样式并赋值
for (int j = 0; j < data.length; j++) {
XSSFCell dataRowCell = dataRow.createCell(j);
dataRowCell.setCellStyle(dataListStyle);
dataRowCell.setCellValue(data[j].toString());
// 自适应列宽
sheet.autoSizeColumn(j);
sheet.setColumnWidth(j, sheet.getColumnWidth(j));
}
}
return wb;
}
/**
* 接口调用
*
* @param title 表格标题
* @param colHead 列头(表头)
* @param dataList 数据列表
*/
public void exportExcel(String title, String[] colHead, List<Object[]> dataList, String fileName) {
try {
XSSFWorkbook result = createExcel(title, colHead, dataList);
FileOutputStream fileOutputStream = new FileOutputStream(fileName);
result.write(fileOutputStream);
fileOutputStream.close();
} catch (Exception e) {
CommonLog.getInstance().error(e);
}
}
/**
* 设置标题样式
*
* @param workbook 表格
* @return 样式
*/
public XSSFCellStyle getTitleStyle(XSSFWorkbook workbook) {
// 设置字体
XSSFFont font = workbook.createFont();
// 设置字体大小
font.setFontHeightInPoints((short) 15);
// 设置字体加粗
font.setBold(true);
// 设置字体样式
font.setFontName("Courier New");
// 设置样式;
XSSFCellStyle style = workbook.createCellStyle();
// 在样式用应用设置的字体;
style.setFont(font);
// 设置自动换行;
style.setWrapText(false);
// 设置水平居中
style.setAlignment(HorizontalAlignment.CENTER);
// 设置垂直居中
style.setVerticalAlignment(VerticalAlignment.CENTER);
// 设置单元格背景颜色
style.setFillForegroundColor(IndexedColors.BLACK.getIndex());
return style;
}
/**
* 给列头设置样式
*
* @param workbook 表格
* @return 样式
*/
public XSSFCellStyle getColHeadStyle(XSSFWorkbook workbook) {
// 设置字体
XSSFFont font = workbook.createFont();
// 设置字体大小
font.setFontHeightInPoints((short) 12);
// 设置字体样式
font.setFontName("Courier New");
// 设置字体加粗
font.setBold(true);
// 设置样式;
XSSFCellStyle style = workbook.createCellStyle();
// 在样式用应用设置的字体;
style.setFont(font);
// 设置水平居中
style.setAlignment(HorizontalAlignment.CENTER);
// 设置垂直居中
style.setVerticalAlignment(VerticalAlignment.CENTER);
// 上边框
style.setBorderTop(BorderStyle.THIN);
// 下边框
style.setBorderBottom(BorderStyle.THIN);
// 左边框
style.setBorderLeft(BorderStyle.THIN);
// 右边框
style.setBorderRight(BorderStyle.THIN);
// 设置自动换行;
style.setWrapText(false);
// 设置单元格背景颜色
style.setFillForegroundColor(IndexedColors.BLACK.getIndex());
return style;
}
/**
* 给数据列表设置样式
*
* @param workbook 表格
* @return 样式
*/
public XSSFCellStyle getDataListStyle(XSSFWorkbook workbook) {
// 设置字体
XSSFFont font = workbook.createFont();
// 设置字体大小
font.setFontHeightInPoints((short) 13);
// 设置字体样式
font.setFontName("Courier New");
// 设置样式;
XSSFCellStyle style = workbook.createCellStyle();
// 在样式用应用设置的字体;
style.setFont(font);
// 设置水平居中
style.setAlignment(HorizontalAlignment.CENTER);
// 设置垂直居中
style.setVerticalAlignment(VerticalAlignment.CENTER);
// 上边框
style.setBorderTop(BorderStyle.THIN);
// 下边框
style.setBorderBottom(BorderStyle.THIN);
// 左边框
style.setBorderLeft(BorderStyle.THIN);
// 右边框
style.setBorderRight(BorderStyle.THIN);
// 设置自动换行;
style.setWrapText(false);
// 设置单元格背景颜色
style.setFillForegroundColor(IndexedColors.BLACK.getIndex());
return style;
}
}
public static void main(String[] args) {
BufferedReader bufferedReader = PosFileUtils.readFile("D:\\1.txt");
PosExcelUtilXlsx posExcelUtilXlsx = new PosExcelUtilXlsx();
String[] title = new String[15];
List<Object[]> contextList = new ArrayList<>();
title[0] = "序号";
title[1] = "日期";
title[2] = "相差时间";
title[3] = "年轻代总内存(M)";
title[4] = "gc前年轻代用量(M)";
title[5] = "gc后年轻代用量(M)";
title[6] = "gc耗时";
title[7] = "堆总内存(M)";
title[8] = "gc前堆内存用量(M)";
title[9] = "gc后堆内存用量(M)";
title[10] = "gc耗时";
title[11] = "总耗时";
title[12] = "老年代总内存(M)";
title[13] = "gc前老年代用量(M)";
title[14] = "gc后老年代用量(M)";
try {
String readLine;
String showDate = null;
int in = 1;
while (null != (readLine = bufferedReader.readLine())) {
if (!readLine.contains("DefNew")) {
continue;
}
String[] context = new String[15];
String date = readLine.substring(0, readLine.indexOf("+0800:")).replace("T", " ");
String defNew = readLine.substring(readLine.indexOf("DefNew: ") + 8, readLine.indexOf("K->"));
String gcDefNew = readLine.substring(readLine.indexOf("K->") + 3, readLine.indexOf("K("));
String totalDefNew = readLine.substring(readLine.indexOf("K(") + 2, readLine.indexOf("K),"));
String gcDefNewTime = readLine.substring(readLine.indexOf("), ") + 3, readLine.indexOf(" secs"));
String heap = readLine.substring(readLine.indexOf("secs] ") + 6, readLine.indexOf("K->", readLine.indexOf("K->") + 1));
String gcHeap = readLine.substring(readLine.indexOf("K->", readLine.indexOf("K->") + 1) + 3, readLine.indexOf("K(", readLine.indexOf("K(") + 1));
String totalHeap = readLine.substring(readLine.indexOf("K(", readLine.indexOf("K(") + 1) + 2, readLine.indexOf("K),", readLine.indexOf("K),") + 1));
String gcHeapTime = readLine.substring(readLine.indexOf("), ", readLine.indexOf("), ") + 1) + 3, readLine.indexOf(" secs", readLine.indexOf(" secs") + 1));
String realContext = readLine.substring(readLine.indexOf("real=") + 5);
String real = realContext.substring(0, realContext.indexOf(" secs"));
String divDate = "0.00";
String dateFormatter = DateFormatter.HYPHEN_YYYY_MM_DD_HH_MM_SS.getFormatter();
SimpleDateFormat sdf = new SimpleDateFormat(dateFormatter);
Date dateParse = sdf.parse(date);
if (CommonMethod.isNotEmpty(showDate)) {
Date showDateParse = sdf.parse(showDate);
divDate = ConvertUtil.toString((dateParse.getTime() - showDateParse.getTime()) / 1000);
}
showDate = date;
context[0] = ConvertUtil.toString(in);
context[1] = date;
context[2] = ConvertUtil.toString(divDate);
context[3] = ConvertUtil.toString(PrecisionUtils.div(ConvertUtil.toDouble(totalDefNew), 1024));
context[4] = ConvertUtil.toString(PrecisionUtils.div(ConvertUtil.toDouble(defNew), 1024));
context[5] = ConvertUtil.toString(PrecisionUtils.div(ConvertUtil.toDouble(gcDefNew), 1024));
context[6] = gcDefNewTime;
context[7] = ConvertUtil.toString(PrecisionUtils.div(ConvertUtil.toDouble(totalHeap), 1024));
context[8] = ConvertUtil.toString(PrecisionUtils.div(ConvertUtil.toDouble(heap), 1024));
context[9] = ConvertUtil.toString(PrecisionUtils.div(ConvertUtil.toDouble(gcHeap), 1024));
context[10] = gcHeapTime;
context[11] = real;
context[12] = ConvertUtil.toString(PrecisionUtils.div(PrecisionUtils.sub(ConvertUtil.toDouble(totalHeap), ConvertUtil.toDouble(totalDefNew)), 1024));
context[13] = ConvertUtil.toString(PrecisionUtils.div(PrecisionUtils.sub(ConvertUtil.toDouble(heap), ConvertUtil.toDouble(defNew)), 1024));
context[14] = ConvertUtil.toString(PrecisionUtils.div(PrecisionUtils.sub(ConvertUtil.toDouble(gcHeap), ConvertUtil.toDouble(gcDefNew)), 1024));
in++;
contextList.add(context);
}
posExcelUtilXlsx.exportExcel("GC数据分析表", title, contextList, "D:\\gc.xlsx");
} catch (Exception e) {
throw new RuntimeException(e);
}
}