使用poi复制excel2007和excel2003
xlsx格式(2007)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class Excel2007CloneUtil {
/**
* 复制2007excel
* @param srcPath 原文件路径
* @return targetPath 复制后的文件路径
* @throws Exception
*/
public static String cloneExcel(String srcPath) throws Exception {
String dateStamp = new java.text.SimpleDateFormat("yyyyMMddHHmmss")
.format(new Date());
String targetPath = srcPath.trim().substring(0,
srcPath.lastIndexOf('.'))
+ "_"
+ dateStamp
+ srcPath.trim().substring(srcPath.lastIndexOf('.'));
try {
ReadExcel(srcPath, targetPath);
} catch (Exception e) {
throw new Exception("excel文件复制失败:" + e.getMessage());
}
return targetPath;
}
/**
* @param srcPath 源文件目录
* @param targetPath 目标文件
*/
private static void ReadExcel(String srcPath, String targetPath)
throws IOException {
InputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream(srcPath);
out = new FileOutputStream(targetPath);
XSSFWorkbook srcWb = new XSSFWorkbook(in);
XSSFWorkbook wbCreat = new XSSFWorkbook();
for (int i = 0; i < srcWb.getNumberOfSheets(); i++) {
XSSFSheet sheet = srcWb.getSheetAt(i);
CreatNewExcel(wbCreat, sheet, i);
}
wbCreat.write(out);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
private static void CreatNewExcel(XSSFWorkbook wbCreat, XSSFSheet sheet,
int chat) throws IOException {
// 创建新的excel
XSSFSheet sheetCreat = wbCreat.createSheet();
wbCreat.setSheetName(chat, sheet.getSheetName());
// 复制源表中的合并单元格
MergerRegion(sheet, sheetCreat);
int firstRow = sheet.getFirstRowNum();
int lastRow = sheet.getLastRowNum();
for (int i = firstRow; i <= lastRow; i++) {
// 创建新建excel Sheet的行
XSSFRow rowCreat = sheetCreat.createRow(i);
// 取得源有excel Sheet的行
XSSFRow row = sheet.getRow(i);
if (null != row) {
// 单元格式样
XSSFCellStyle cellStyle = null;
int firstCell = row.getFirstCellNum();
int lastCell = row.getLastCellNum();
for (int j = firstCell; j < lastCell; j++) {
if (null != row.getCell(j)) {
// 自动适应列宽 貌似不起作用
sheetCreat.autoSizeColumn(j);
// new一个式样
cellStyle = wbCreat.createCellStyle();
// 设置边框线型
cellStyle.setBorderTop(row.getCell(j).getCellStyle()
.getBorderTop());
cellStyle.setBorderBottom(row.getCell(j).getCellStyle()
.getBorderBottom());
cellStyle.setBorderLeft(row.getCell(j).getCellStyle()
.getBorderLeft());
cellStyle.setBorderRight(row.getCell(j).getCellStyle()
.getBorderRight());
// 设置内容位置:例水平居中,居右,居工
cellStyle.setAlignment(row.getCell(j).getCellStyle()
.getAlignment());
// 设置内容位置:例垂直居中,居上,居下
cellStyle.setVerticalAlignment(row.getCell(j)
.getCellStyle().getVerticalAlignment());
// 自动换行
cellStyle.setWrapText(row.getCell(j).getCellStyle()
.getWrapText());
rowCreat.createCell(j).setCellStyle(cellStyle);
// 设置单元格高度
rowCreat.getCell(j).getRow().setHeight(
row.getCell(j).getRow().getHeight());
// 单元格类型
switch (row.getCell(j).getCellType()) {
case XSSFCell.CELL_TYPE_STRING:
String strVal = removeInternalBlank(row.getCell(j)
.getStringCellValue());
rowCreat.getCell(j).setCellValue(strVal);
break;
case XSSFCell.CELL_TYPE_NUMERIC:
rowCreat.getCell(j).setCellValue(
row.getCell(j).getNumericCellValue());
break;
case XSSFCell.CELL_TYPE_FORMULA:
try {
// String temp = String.valueOf(row.getCell(j)
// .getNumericCellValue());
// rowCreat.getCell(j).setCellValue(
// new Double(temp));
rowCreat.getCell(j).setCellValue(
row.getCell(j).getNumericCellValue());
// rowCreat.getCell(j).setCellValue(
// String.valueOf(row.getCell(j)
// .getNumericCellValue()));
} catch (Exception e) {
try {
rowCreat.getCell(j).setCellValue(
String.valueOf(row.getCell(j)
.getRichStringCellValue()));
} catch (Exception ex) {
rowCreat.getCell(j).setCellValue("公式出错");
}
}
break;
}
}
}
}
}
}
/**
* 复制原有sheet的合并单元格到新创建的sheet
*
* @param sheet
* 原有的sheet
* @param sheetCreat
* 新创建sheet
*/
private static void MergerRegion(XSSFSheet sheet, XSSFSheet sheetCreat) {
int sheetMergerCount = sheet.getNumMergedRegions();
for (int i = 0; i < sheetMergerCount; i++) {
CellRangeAddress mergedRegionAt = sheet.getMergedRegion(i);
sheetCreat.addMergedRegion(mergedRegionAt);
}
}
/**
* 去除字符串内部空格
*/
public static String removeInternalBlank(String s) {
Pattern p = Pattern.compile("");
Matcher m = p.matcher(s);
char str[] = s.toCharArray();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < str.length; i++) {
if (str[i] == ' ') {
sb.append(' ');
} else {
break;
}
}
String after = m.replaceAll("");
return sb.toString() + after;
}
public static void main(String[] args) throws Exception, IOException {
Excel2007CloneUtil cloneUtil = new Excel2007CloneUtil();
String xlsPath = "";
String newFilePath = cloneExcel(xlsPath);
System.out.println(newFilePath);
}
}
xls格式(2003)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
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.util.CellRangeAddress;
public class Excel2003CloneUtil {
/**
* 复制2003excel
* @param srcPath 原文件路径
* @return targetPath 复制后的文件路径
* @throws Exception
*/
public static String cloneExcel(String srcPath) throws Exception {
String dateStamp = new java.text.SimpleDateFormat("yyyyMMddHHmmss")
.format(new Date());
String targetPath = srcPath.trim().substring(0,
srcPath.lastIndexOf('.'))
+ "_"
+ dateStamp
+ srcPath.trim().substring(srcPath.lastIndexOf('.'));
try {
ReadExcel(srcPath, targetPath);
} catch (Exception e) {
throw new Exception("excel文件复制失败:" + e.getMessage());
}
return targetPath;
}
/**
* @param srcPath 源文件目录
* @param targetPath 目标文件
*/
private static void ReadExcel(String srcPath, String targetPath)
throws IOException {
InputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream(srcPath);
out = new FileOutputStream(targetPath);
HSSFWorkbook srcWb = new HSSFWorkbook(in);
HSSFWorkbook wbCreat = new HSSFWorkbook();
for (int i = 0; i < srcWb.getNumberOfSheets(); i++) {
HSSFSheet sheet = srcWb.getSheetAt(i);
CreatNewExcel(wbCreat, sheet, i);
}
wbCreat.write(out);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
private static void CreatNewExcel(HSSFWorkbook wbCreat, HSSFSheet sheet,
int chat) throws IOException {
// 创建新的excel
HSSFSheet sheetCreat = wbCreat.createSheet();
wbCreat.setSheetName(chat, sheet.getSheetName());
// 复制源表中的合并单元格
MergerRegion(sheet, sheetCreat);
int firstRow = sheet.getFirstRowNum();
int lastRow = sheet.getLastRowNum();
for (int i = firstRow; i <= lastRow; i++) {
// 创建新建excel Sheet的行
HSSFRow rowCreat = sheetCreat.createRow(i);
// 取得源有excel Sheet的行
HSSFRow row = sheet.getRow(i);
if (null != row) {
// 单元格式样
HSSFCellStyle cellStyle = null;
int firstCell = row.getFirstCellNum();
int lastCell = row.getLastCellNum();
for (int j = firstCell; j < lastCell; j++) {
if (null != row.getCell(j)) {
// 自动适应列宽 貌似不起作用
sheetCreat.autoSizeColumn(j);
// new一个式样
cellStyle = wbCreat.createCellStyle();
// 设置边框线型
cellStyle.setBorderTop(row.getCell(j).getCellStyle()
.getBorderTop());
cellStyle.setBorderBottom(row.getCell(j).getCellStyle()
.getBorderBottom());
cellStyle.setBorderLeft(row.getCell(j).getCellStyle()
.getBorderLeft());
cellStyle.setBorderRight(row.getCell(j).getCellStyle()
.getBorderRight());
// 设置内容位置:例水平居中,居右,居工
cellStyle.setAlignment(row.getCell(j).getCellStyle()
.getAlignment());
// 设置内容位置:例垂直居中,居上,居下
cellStyle.setVerticalAlignment(row.getCell(j)
.getCellStyle().getVerticalAlignment());
// 自动换行
cellStyle.setWrapText(row.getCell(j).getCellStyle()
.getWrapText());
rowCreat.createCell(j).setCellStyle(cellStyle);
// 设置单元格高度
rowCreat.getCell(j).getRow().setHeight(
row.getCell(j).getRow().getHeight());
// 单元格类型
switch (row.getCell(j).getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
String strVal = removeInternalBlank(row.getCell(j)
.getStringCellValue());
rowCreat.getCell(j).setCellValue(strVal);
break;
case HSSFCell.CELL_TYPE_NUMERIC:
rowCreat.getCell(j).setCellValue(
row.getCell(j).getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_FORMULA:
try {
// String temp = String.valueOf(row.getCell(j)
// .getNumericCellValue());
// rowCreat.getCell(j).setCellValue(
// new Double(temp));
rowCreat.getCell(j).setCellValue(
row.getCell(j).getNumericCellValue());
// rowCreat.getCell(j).setCellValue(
// String.valueOf(row.getCell(j)
// .getNumericCellValue()));
} catch (Exception e) {
try {
rowCreat.getCell(j).setCellValue(
String.valueOf(row.getCell(j)
.getRichStringCellValue()));
} catch (Exception ex) {
rowCreat.getCell(j).setCellValue("公式出错");
}
}
break;
}
}
}
}
}
}
/**
* 复制原有sheet的合并单元格到新创建的sheet
*
* @param sheet
* 原有的sheet
* @param sheetCreat
* 新创建sheet
*/
private static void MergerRegion(HSSFSheet sheet, HSSFSheet sheetCreat) {
int sheetMergerCount = sheet.getNumMergedRegions();
for (int i = 0; i < sheetMergerCount; i++) {
CellRangeAddress mergedRegionAt = sheet.getMergedRegion(i);
sheetCreat.addMergedRegion(mergedRegionAt);
}
}
/**
* 去除字符串内部空格
*/
public static String removeInternalBlank(String s) {
Pattern p = Pattern.compile("");
Matcher m = p.matcher(s);
char str[] = s.toCharArray();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < str.length; i++) {
if (str[i] == ' ') {
sb.append(' ');
} else {
break;
}
}
String after = m.replaceAll("");
return sb.toString() + after;
}
public static void main(String[] args) throws Exception, IOException {
Excel2003CloneUtil cloneUtil = new Excel2003CloneUtil();
String xlsPath = "C:\\Users\\wang.chunlong\\Desktop\\2021\\10\\境外子报送\\test\\境外子公司财务及业务报表(vba)-v13_20211116.xlsm";
String newFilePath = cloneExcel(xlsPath);
System.out.println(newFilePath);
}
}