有谁知道使用 POI 将工作表从一个工作簿复制到另一个工作簿的方法?Workbook 类有一个 cloneSheet 方法,但似乎无法将克隆的工作表插入到新工作簿中?
如果没有 API 可以轻松做到这一点,是否有人拥有将所有数据(样式、列宽、数据等)从一张纸复制到另一张纸的代码?
jxls 有复制工作表的方法,但是在工作簿之间复制时它们不起作用。
有谁知道使用 POI 将工作表从一个工作簿复制到另一个工作簿的方法?Workbook 类有一个 cloneSheet 方法,但似乎无法将克隆的工作表插入到新工作簿中?
如果没有 API 可以轻松做到这一点,是否有人拥有将所有数据(样式、列宽、数据等)从一张纸复制到另一张纸的代码?
jxls 有复制工作表的方法,但是在工作簿之间复制时它们不起作用。
我已经用 poi 实现了一些功能。请参阅代码供您参考。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
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;
public class ExcelReadAndWrite {
public static void main(String[] args) throws IOException {
ExcelReadAndWrite excel = new ExcelReadAndWrite();
excel.process("D:/LNN/My Workspace/POI/src/tables.xls");
}
public void process(String fileName) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileName));
HSSFWorkbook workbook = new HSSFWorkbook(bis);
HSSFWorkbook myWorkBook = new HSSFWorkbook();
HSSFSheet sheet = null;
HSSFRow row = null;
HSSFCell cell = null;
HSSFSheet mySheet = null;
HSSFRow myRow = null;
HSSFCell myCell = null;
int sheets = workbook.getNumberOfSheets();
int fCell = 0;
int lCell = 0;
int fRow = 0;
int lRow = 0;
for (int iSheet = 0; iSheet < sheets; iSheet++) {
sheet = workbook.getSheetAt(iSheet);
if (sheet != null) {
mySheet = myWorkBook.createSheet(sheet.getSheetName());
fRow = sheet.getFirstRowNum();
lRow = sheet.getLastRowNum();
for (int iRow = fRow; iRow <= lRow; iRow++) {
row = sheet.getRow(iRow);
myRow = mySheet.createRow(iRow);
if (row != null) {
fCell = row.getFirstCellNum();
lCell = row.getLastCellNum();
for (int iCell = fCell; iCell < lCell; iCell++) {
cell = row.getCell(iCell);
myCell = myRow.createCell(iCell);
if (cell != null) {
myCell.setCellType(cell.getCellType());
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_BLANK:
myCell.setCellValue("");
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
myCell.setCellValue(cell.getBooleanCellValue());
break;
case HSSFCell.CELL_TYPE_ERROR:
myCell.setCellErrorValue(cell.getErrorCellValue());
break;
case HSSFCell.CELL_TYPE_FORMULA:
myCell.setCellFormula(cell.getCellFormula());
break;
case HSSFCell.CELL_TYPE_NUMERIC:
myCell.setCellValue(cell.getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_STRING:
myCell.setCellValue(cell.getStringCellValue());
break;
default:
myCell.setCellFormula(cell.getCellFormula());
}
}
}
}
}
}
}
bis.close();
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("workbook.xls", true));
myWorkBook.write(bos);
bos.close();
}
}
我为 NPOI 创建了一个工作项:http://npoi.codeplex.com/WorkItem/View.aspx ? WorkItemId=6057 。
更新:工作项在 NPOI 2.0 中实现。您可以从https://npoi.codeplex.com/releases/view/112932下载 NPOI 2.0
如果您使用的是 Java POI 库,最好将电子表格加载到内存中,然后创建一个新的并写入您要复制的每条记录……这不是最好的方法,但可以完成复制功能。 ..
这是我将工作表从一个工作簿复制到另一个工作簿的实现。这个解决方案对我有用。如果工作表没有表格等,则此代码将起作用。如果工作表包含简单文本(字符串、布尔值、int 等)、公式,则此解决方案将起作用。
Workbook oldWB = new XSSFWorkbook(new FileInputStream("C:\\input.xlsx"));
Workbook newWB = new XSSFWorkbook();
CellStyle newStyle = newWB.createCellStyle(); // Need this to copy over styles from old sheet to new sheet. Next step will be processed below
Row row;
Cell cell;
for (int i = 0; i < oldWB.getNumberOfSheets(); i++) {
XSSFSheet sheetFromOldWB = (XSSFSheet) oldWB.getSheetAt(i);
XSSFSheet sheetForNewWB = (XSSFSheet) newWB.createSheet(sheetFromOldWB.getSheetName());
for (int rowIndex = 0; rowIndex < sheetFromOldWB.getPhysicalNumberOfRows(); rowIndex++) {
row = sheetForNewWB.createRow(rowIndex); //create row in this new sheet
for (int colIndex = 0; colIndex < sheetFromOldWB.getRow(rowIndex).getPhysicalNumberOfCells(); colIndex++) {
cell = row.createCell(colIndex); //create cell in this row of this new sheet
Cell c = sheetFromOldWB.getRow(rowIndex).getCell(colIndex, Row.CREATE_NULL_AS_BLANK ); //get cell from old/original WB's sheet and when cell is null, return it as blank cells. And Blank cell will be returned as Blank cells. That will not change.
if (c.getCellType() == Cell.CELL_TYPE_BLANK){
System.out.println("This is BLANK " + ((XSSFCell) c).getReference());
}
else { //Below is where all the copying is happening. First It copies the styles of each cell and then it copies the content.
CellStyle origStyle = c.getCellStyle();
newStyle.cloneStyleFrom(origStyle);
cell.setCellStyle(newStyle);
switch (c.getCellTypeEnum()) {
case STRING:
cell.setCellValue(c.getRichStringCellValue().getString());
break;
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
cell.setCellValue(c.getDateCellValue());
} else {
cell.setCellValue(c.getNumericCellValue());
}
break;
case BOOLEAN:
cell.setCellValue(c.getBooleanCellValue());
break;
case FORMULA:
cell.setCellValue(c.getCellFormula());
break;
case BLANK:
cell.setCellValue("who");
break;
default:
System.out.println();
}
}
}
}
}
//Write over to the new file
FileOutputStream fileOut = new FileOutputStream("C:\\output.xlsx");
newWB.write(fileOut);
oldWB.close();
newWB.close();
fileOut.close();
如果您的要求是照原样复制完整的工作表而不留下任何东西,那么在这种情况下,消除过程会比上面的代码效果更好,速度更快,您不必担心丢失公式、图纸、表格、样式、字体等.
XSSFWorkbook wb = new XSSFWorkbook("C:\\abc.xlsx");
for (int i = wb.getNumberOfSheets() - 1; i >= 0; i--) {
if (!wb.getSheetName(i).contentEquals("January")) //This is a place holder. You will insert your logic here to get the sheets that you want.
wb.removeSheetAt(i); //Just remove the sheets that don't match your criteria in the if statement above
}
FileOutputStream out = new FileOutputStream(new File("C:\\xyz.xlsx"));
wb.write(out);
out.close();
我花了大约一周的时间来使用 POI(使用 coderanch 上的最新代码)进行此操作 - 请注意代码有缺陷(使用 TreeSet 存在问题,您需要用 HashMap 替换它),但即使在修复之后它在公式上崩溃。
虽然有可能做到这一点,但不得不依赖破解的代码是一个可怕的提议。
根据您的需求/预算,您可能需要考虑硬着头皮购买 aspose - http://www.aspose.com/doctest/java-components/aspose.cells-for-java/copy-move-worksheets-within -and-between-workbooks.html
它成功复制了表格,包括格式、公式和保护规则。我在 130 秒内完成了 300 张。(300 x 90kb 工作簿,编译成一个 15mb 工作簿)。该演示是免费的,它只是在工作簿中添加了一张额外的表格,提醒您购买许可证。
最好的方法是打开文件并加载它。如果您想要源 Excel 文件中的任何特定工作表,则只需删除与预期工作表不匹配的工作表。
尝试这个:
FileInputStream fis=new FileInputStream("D:\\SourceExcel.xls");
Workbook wb=WorkbookFactory.create(fis);
for (int i = wb.getNumberOfSheets() - 1; i >= 0; i--) {
if (!wb.getSheetName(i).contentEquals("SheetNameWhichwantToRetain")) //This is a place holder. You will insert your logic here to get the sheets that you want.
wb.removeSheetAt(i); //Just remove the sheets that don't match your criteria in the if statement above
}
FileOutputStream fos = new FileOutputStream(new File("D:\\DestinationFileName.xls"));
wb.write(fos);
fos.close();
System.out.println("file is copied in a new file at destination :"+"D:\\DestinationFileName.xls");
}
catch(Exception e){
e.printStackTrace();
}