package com.sobey.cmop.mvc.service.basicdata;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.sobey.cmop.mvc.entity.HostServer;
import com.sobey.cmop.mvc.entity.IpPool;
import com.sobey.cmop.mvc.service.basicdata.imports.ServerBean;
import com.sobey.cmop.mvc.service.vm.HostTree;
public class PoiUtil {
private static final Logger logger = LoggerFactory.getLogger(PoiUtil.class);
public static void main(String[] args) throws Exception {
// 1. 同步所有宿主机及其虚拟机
List list = HostTree.call();
writeExcel("C:/Users/Jason/Desktop/Host_Vm.xls", "宿主机及其虚拟机关系表",
new String[] { "宿主机IP", "DisplayName", "虚拟机IP" }, list);
}
/**
* 导出到Excel
*
* @param file
* @return
*/
public static void writeExcel(String fileName, String sheetName, String[] headers, Iterable<HostServer> hosts) {
FileInputStream fis;
try {
// 声明一个工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
// 生成一个表格
HSSFSheet sheet = workbook.createSheet(sheetName);
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {
setCell(row, i, headers[i]);
}
int countHost = 0;
int countVm = 0;
int countHostNoVm = 0;
for (HostServer host : hosts) {
Set<IpPool> vms = host.getIpPools();
countHost++;
if (vms.size() > 1) {
sheet.addMergedRegion(new CellRangeAddress(countVm + countHostNoVm + 1, countVm + countHostNoVm
+ vms.size(), 0, 0));
}
if (vms.size() > 0) {
for (IpPool vm : vms) {
countVm++;
row = sheet.createRow(countVm + countHostNoVm);
setCell(row, 0, host.getIpAddress());
setCell(row, 1, "");
setCell(row, 2, vm.getIpAddress());
}
} else {
countHostNoVm++;
row = sheet.createRow(countVm + countHostNoVm);
setCell(row, 0, host.getIpAddress());
setCell(row, 1, "");
setCell(row, 2, "");
}
}
FileOutputStream fileOut = new FileOutputStream(fileName);
workbook.write(fileOut);
fileOut.close();
logger.info("--->写入Excel成功!");
} catch (IOException e) {
e.printStackTrace();
logger.info("--->写入Excel失败!");
}
}
/**
* 设置单元格
*/
public static HSSFCell setCell(HSSFRow row, int index, String value) {
HSSFCell cell = row.createCell(index);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(value);
return cell;
}
/**
* 根据输入流解析基础数据Excel
*
* @param file
* @return
*/
public static List parseExcel(InputStream file) {
try {
// 根据输入流创建Workbook对象
Workbook wb = WorkbookFactory.create(file);
// 根据Workbook对象操作Sheet对象
int sheetNumber = wb.getNumberOfSheets();
logger.info("Sheet Number:" + sheetNumber);
// 解析HostServer
List<ServerBean> list1 = new ArrayList<ServerBean>();
if (sheetNumber > 0) {
Sheet sheet = wb.getSheetAt(0);
logger.info("Sheet Name:" + sheet.getSheetName());
for (Row row : sheet) {
// 跳过表头
if (row.getRowNum() == 0) {
continue;
}
// 跳过空行
if (row.getPhysicalNumberOfCells() == 0) {
continue;
}
StringBuffer sb = new StringBuffer();
ServerBean server = new ServerBean();
String cellValue = "";
for (Cell cell : row) {
cellValue = getCell(cell);
if (cell.getColumnIndex() == 0) {
server.setHostIp(cellValue);
// if (isMergedRegion(sheet, cell.getRowIndex(),
// cell.getColumnIndex())) {
// server.setHostIp(getMergedRegionValue(sheet,
// cell.getRowIndex(), cell.getColumnIndex()));
// }
} else if (cell.getColumnIndex() == 1) {
if (cellValue.equals("")) {
server.setDisplayName(server.getHostIp()); // 显示名称如果为空,默认为内网IP,注意写入OneCMDB时判断
} else {
server.setDisplayName(cellValue);
server.setCompany(cellValue.split(" ")[0]);
server.setModel(cellValue.split(" ")[1]);
server.setRack(cellValue.split(" ")[2].split("-")[0]);
server.setSite(cellValue.substring(cellValue.split("-")[0].length() + 1,
cellValue.length()));
}
} else if (cell.getColumnIndex() == 2) {
server.setInnerIp(cellValue);
}
sb.append(cellValue).append(",");
}
list1.add(server);
logger.info("--->第[" + (row.getRowNum()) + "]行数据:" + sb.toString());
}
}
List list = new ArrayList();
list.add(list1);
logger.info("--->共解析到记录数:宿主机与虚拟机关系-" + list1.size());
return list;
} catch (Exception e) {
e.printStackTrace();
logger.info("--->解析基础数据失败:" + e.getMessage());
return null;
}
}
/**
* 判断单元格是否合并
*
* @param sheet
* @param row
* @param column
* @return
*/
public static boolean isMergedRegion(Sheet sheet, int row, int column) {
int sheetMergeCount = sheet.getNumMergedRegions();
for (int i = 0; i < sheetMergeCount; i++) {
CellRangeAddress ca = sheet.getMergedRegion(i);
int firstColumn = ca.getFirstColumn();
int lastColumn = ca.getLastColumn();
int firstRow = ca.getFirstRow();
int lastRow = ca.getLastRow();
if (row >= firstRow && row <= lastRow) {
if (column >= firstColumn && column <= lastColumn) {
return true;
}
}
}
return false;
}
/**
* 获得合并单元格的值
*
* @param sheet
* @param row
* @param column
* @return
*/
public static String getMergedRegionValue(Sheet sheet, int row, int column) {
int sheetMergeCount = sheet.getNumMergedRegions();
for (int i = 0; i < sheetMergeCount; i++) {
CellRangeAddress ca = sheet.getMergedRegion(i);
int firstColumn = ca.getFirstColumn();
int lastColumn = ca.getLastColumn();
int firstRow = ca.getFirstRow();
int lastRow = ca.getLastRow();
if (row >= firstRow && row <= lastRow) {
if (column >= firstColumn && column <= lastColumn) {
Row fRow = sheet.getRow(firstRow);
Cell fCell = fRow.getCell(firstColumn);
return getCell(fCell);
}
}
}
return null;
}
/**
* 读取每行单元值
*
* @param cell
* @return
*/
public static String getCell(Cell cell) {
String cellValue = "";
if (cell == null)
return cellValue;
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
// 得到Boolean对象的方法
cellValue = cell.getBooleanCellValue() + "";
break;
case Cell.CELL_TYPE_NUMERIC:
// 先看是否是日期格式
if (DateUtil.isCellDateFormatted(cell)) {
// 读取日期格式
cellValue = cell.getDateCellValue() + "";
} else {
// 读取数字
cellValue = cell.getNumericCellValue() + "";
}
break;
case Cell.CELL_TYPE_FORMULA:
// 读取公式
cellValue = cell.getCellFormula() + "";
break;
case Cell.CELL_TYPE_STRING:
// 读取String
cellValue = cell.getRichStringCellValue().toString() + "";
break;
case Cell.CELL_TYPE_ERROR:
cellValue = cell.getErrorCellValue() + "";
break;
default:
cellValue = "";
break;
// case Cell.CELL_TYPE_BLANK:
}
return cellValue.trim();
}
}