ExcelをHTML生成

パッケージcom.sun.test.htmlexcel。

輸入lombok.Data;

@data
パブリッククラスCrossRangeCellMeta {
/ *
* @param firstRowIndex起始行
* @param firstColIndex起始列
* @param ROWSPAN合并行数目
* @param COLSPAN合并列数目
* /
INT LASTROW。
firstRowのint型;
int型lastCol;
int型firstCol;

公共CrossRangeCellMeta(INT LASTROW、INT firstRowの、INT lastCol、INT firstCol){
this.lastRow = LASTROW。
this.firstRow = firstRowの。
this.lastCol = lastCol。
this.firstCol = firstCol。
}
}

================================================== ================================================== ===================

パッケージcom.sun.test.htmlexcel。

インポートのjava.io.File;
輸入はjava.util.ArrayList;
輸入はjava.util.List;

輸入org.apache.commons.lang3.StringUtils。
輸入org.apache.commons.lang3.math.NumberUtils。
輸入org.apache.poi.hssf.usermodel.HSSFCell;
輸入org.apache.poi.hssf.usermodel.HSSFCellStyle;
輸入org.apache.poi.hssf.usermodel.HSSFFont;
輸入org.apache.poi.hssf.usermodel.HSSFRow。
輸入org.apache.poi.hssf.usermodel.HSSFSheet;
輸入org.apache.poi.hssf.usermodel.HSSFWorkbook;
輸入org.apache.poi.hssf.util.HSSFCellUtil;
輸入org.apache.poi.hssf.util.HSSFColor;
輸入org.apache.poi.ss.util.CellRangeAddress;
輸入org.dom4j.Document;
輸入org.dom4j.DocumentException。
輸入org.dom4j.DocumentHelper;
輸入org.dom4j.Element;

パブリッククラスtable2Excel {

パブリック静的HSSFWorkbook table2Excel(文字列tableHtml)はDocumentExceptionを{スロー
HSSFWorkbook WB =新しいHSSFWorkbook()。
HSSFSheetシート= wb.createSheet()。
一覧<CrossRangeCellMeta> crossRowEleMetaLs =新しいのArrayList <CrossRangeCellMeta>();
文書データ= DocumentHelper.parseText(tableHtml)。
System.out.println( "=" +データ)。
int型rowIndexに= 0;
//生成表头
要素THEAD = data.getRootElement()要素( "THEAD")。
HSSFCellStyle titleStyle = getTitleStyle(WB)。
int型のLS = 0; //列数
(もし!THEAD = NULL){
一覧<要素> TRLS = thead.elements( "TR");
System.out.println( "=" + trLs.size())。
{(TRLS要素trEle)のために
HSSFRow行= sheet.createRow(rowIndexプロパティ)。
一覧<要素> thLs = trEle.elements( "目");
thLs.forEach(E->のSystem.out.println(e.attribute(1)))。
LS = thLs.size()。
makeRowCell(thLs、rowIndexに、行0、titleStyle、crossRowEleMetaLs)。
rowIndexに++;
}
}
//生成表体
要素TBODY = data.getRootElement()要素( "TBODY")。
HSSFCellStyle contentStyle = getContentStyle(WB)。
もし(!のtbody = NULL){
一覧<要素> TRLS = tbody.elements( "TR");
(要素trEle:TRLS)用{
HSSFRow行= sheet.createRow(rowIndexプロパティ)。
一覧<要素> thLs = trEle.elements( "目");
INT cellIndex = makeRowCell(thLs、rowIndexに、行0、titleStyle、
一覧<要素> TDLS = trEle.elements( "TD");
makeRowCell(TDLS、rowIndexに、行、cellIndex、contentStyle、crossRowEleMetaLs)。
rowIndexに++;
}
}
//合并表头
用(CrossRangeCellMeta CRCM:crossRowEleMetaLs){
sheet.addMergedRegion(新しいCellRangeAddress(crcm.getFirstRow()、crcm.getLastRow()、crcm.getFirstCol()、crcm.getLastCol()))。
setRegionStyle(シート、新しいCellRangeAddress(crcm.getFirstRow()、crcm.getLastRow()、crcm.getFirstCol()、crcm.getLastCol())、contentStyle)。
}
ため(INT I 0 =; I <LS; I ++){
sheet.autoSizeColumn(I、TRUE); //设置列宽
}

WB返します。
}
/ **
*获得内容样式
*
* @param WB
* @return
* /
プライベート静的HSSFCellStyle getContentStyle(HSSFWorkbook WB){
ショートのfontSize = 12。
文字列たfontName = "宋体"。
HSSFCellStyleスタイル= wb.createCellStyle();
style.setBorderBottom((ショート)1)。
style.setBorderTop((ショート)1)。
style.setBorderLeft((ショート)1)。
style.setBorderRight((ショート)1)。
HSSFFontフォント= wb.createFont()。
font.setFontName(たfontName)。
font.setFontHeightInPoints(のfontSize)。
style.setFont(フォント)。
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //垂直居中

戻りスタイル。
}
/ **
*设置合并单元格的边框样式
*
* @paramシート
* @param領域
* @param CS
* /
パブリック静的ボイドsetRegionStyle(HSSFSheetシート、CellRangeAddress領域、HSSFCellStyle CS){
(INT I = region.getFirstRow用(); I <= region.getLastRow(); I ++){
HSSFRow行= HSSFCellUtil.getRow(I、シート)
用(INT J = region.getFirstColumn(); J <= region.getLastColumn(); J ++){
HSSFCellセル= HSSFCellUtil.getCell(行、(短い)J)。
cell.setCellStyle(CS)。
}
}
}

/ **
*生産ラインの内容
*
*最後の列のセルの@returnインデックス

* @param TDLS TDセットまたはTH
* @param rowIndexに行番号
* @param行POI列オブジェクト
* @param startCellIndex
* @param CellStyleスタイル
* @param crossRowEleMetaLsメタデータのインターバンク組
* @return
* /
makeRowCell(一覧<要素> TDLS、INT rowIndexに、HSSFRow行、INT startCellIndex、HSSFCellStyle CellStyle、INTプライベート静的
リスト<CrossRangeCellMeta> crossRowEleMetaLs){
int型I = startCellIndex;
(INT = 0 eleIndex用; eleIndex <tdLs.size(); I ++、eleIndex ++){
int型= captureCellSize getCaptureCellSize(rowIndexに、I、crossRowEleMetaLs);
一方(captureCellSize> 0){
用(INT J = 0; J <captureCellSize; J ++){//当前行跨列处理(补单元格)
row.createCell(I)。
I ++;
}
captureCellSize = getCaptureCellSize(rowIndexに、I、crossRowEleMetaLs)。
}
要素thEle = tdLs.get(eleIndex)。
ストリングヴァル= thEle.getTextTrim()。
(StringUtils.isBlank(ヴァル)){場合
エレメントはE = thEle.element( "")。
(もし!E = NULL){
valを= e.getTextTrim();
}
}
HSSFCell C = row.createCell(I)。
IF(NumberUtils.isNumber(ヴァル)){
c.setCellValue(Double.parseDouble(ヴァル))。
c.setCellType(HSSFCell.CELL_TYPE_NUMERIC)。
}他{
c.setCellValue(ヴァル)。
}
NumberUtils.toInt ROWSPAN = INT(thEle.attributeValue( "ROWSPAN"),. 1);
INT = COLSPAN NumberUtils.toInt(thEle.attributeValue( "COLSPAN"),. 1);
c.setCellStyle(CellStyle)
。IF(ROWSPAN> 1 || COLSPAN> 1){//インターバンク存在または列にわたって
crossRowEleMetaLs.add(新しい新しいCrossRangeCellMeta(rowIndexに、I、ROWSPAN、COLSPAN));
}
。(COLSPAN> IF 1){//現在の行(フィルセルを処理カラムを横切ります)
(INT 1 = Jため; J <COLSPAN; J ++){
I ++;
row.createCell(I);
}
}
}
私はリターン;
}
/ **
*得られた細胞は、ROWSPANによって占有
*
* @param rowIndexに行番号を
* @param colIndex列番号
*ランクメタデータを横切っ@paramのcrossRowEleMetaLs
カラム必要の* @return現在の行がセルを占有します
* /
getCaptureCellSize INTプライベート静的(rowIndexにINT、INT colIndex、リスト<CrossRangeCellMeta> crossRowEleMetaLs){
int型captureCellSize = 0。
{(crossRowEleMetaLs CrossRangeCellMeta crossRangeCellMeta)のための
IF(crossRangeCellMeta.getFirstRow()<rowIndexに&& crossRangeCellMeta.getLastRow()> = rowIndexプロパティ){
IF(crossRangeCellMeta.getFirstCol()<= colIndex && crossRangeCellMeta.getLastCol()> = colIndex){
captureCellSize = crossRangeCellMeta.getLastCol() - colIndex + 1。
}
}
}
captureCellSizeを返します。
}
/ **
*获得标题样式
* @param WS
* @return
* /
パブリック静的HSSFCellStyle getTitleStyle(HSSFWorkbook WS){
短いtitlebackgroundcolorはHSSFColor.GREY_25_PERCENT.indexを=。
短いのfontSize = 12。
文字列たfontName = "宋体"。
HSSFCellStyleスタイル= ws.createCellStyle();
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER)。
style.setAlignment(HSSFCellStyle.ALIGN_CENTER)。
style.setBorderBottom(HSSFCellStyle.BORDER_THIN)。//下边框
style.setBorderLeft(HSSFCellStyle.BORDER_THIN); //左边框
style.setBorderTop(HSSFCellStyle.BORDER_THIN); //上边框
style.setBorderRight(HSSFCellStyle.BORDER_THIN); //右边框
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND );
style.setFillForegroundColor(titlebackgroundcolor); //背景色
HSSFFontフォント= ws.createFont();
font.setFontName(たfontName)。
font.setFontHeight(HSSFFont.SYMBOL_CHARSET)。
font.setFontHeightInPoints(のfontSize)。
style.setFont(フォント)。
スタイルを返します。
}

公共の静的な無効メイン(文字列[]引数)がDocumentException {スロー

ファイルf =新しいファイル(「」)。
System.out.println(f.getAbsolutePath())。
文字列s = " '1.0'";
文字列グラム= " 'UTF-8'";
HSSFWorkbook WB = table2Excel( "<TABLE> <THEAD> <TR> <TH> xingming </番目> </ TR> </ THEAD> </ TABLE>");
// HSSFWorkbook WB = table2Excel( "D:/代码/test/test/src/main/resources/test.xml")。
}
}

おすすめ

転載: www.cnblogs.com/sunjinwei/p/12033384.html