2009-05-11 17 views
21

में एक्सेल वर्कशीट्स की प्रतिलिपि बनाना क्या कोई पीओआई का उपयोग करके वर्कशीट को एक कार्यपुस्तिका से दूसरे में कॉपी करने के साधनों के बारे में जानता है? वर्कबुक क्लास में क्लोन शीट विधि है, लेकिन ऐसा लगता है कि क्लोन शीट को एक नई वर्कबुक में डालने में सक्षम नहीं है?पीओआई

यदि कोई आसानी से ऐसा करने के लिए कोई एपीआई नहीं है, तो क्या किसी के पास एक शीट से दूसरे डेटा (शैलियों, कॉलम चौड़ाई, डेटा इत्यादि) की प्रतिलिपि बनाने के लिए कोड है?

जेक्सएलएस में चादरों की प्रतिलिपि बनाने के तरीके हैं, लेकिन कार्यपुस्तिकाओं के बीच प्रतिलिपि करते समय वे काम नहीं करते हैं।

+1

यह [कड़ी] (http://www.coderanch.com/t/420958/open-source में चिंता करने की जरूरत नहीं है/प्रतिलिपि-शीट-एक्सेल-फ़ाइल-अन्य) सहायक होना चाहिए: – hkansal

+0

@ हंसलल जो लिंक मुझे मिला जब मैं गुगल रहा था। मुझे उस लिंक में दिए गए कोड के साथ एक समस्या का सामना करना पड़ा, जब सेल को स्तंभ 1 के रूप में समूहीकृत किया गया है: ए 4 यह विलय क्षेत्र को ओवरलैप करने जैसी त्रुटि दिखाता है, मैं उस लिंक में एक उत्तर पोस्ट नहीं कर सकता। यह वास्तव में अच्छा है। –

उत्तर

2

से एनपीओआई 2.0 डाउनलोड कर सकते हैं यदि आप जावा पीओआई लाइब्रेरी का उपयोग कर रहे हैं तो स्प्रेडशीट को मेमोरी में लोड करना सबसे अच्छा होगा, फिर एक नया बनाएं और प्रत्येक रिकॉर्ड को कॉपी करें जिसे आप प्रतिलिपि बनाना चाहते हैं .. सबसे अच्छा तरीका नहीं है लेकिन कॉपी फ़ंक्शन को लागू करता है ...

1

मैंने इसे पीओआई (कोडरंच पर नवीनतम कोड का उपयोग करके) करने में लगभग एक सप्ताह का प्रयास किया - चेतावनी दी जानी चाहिए कि कोड त्रुटिपूर्ण है (इसमें कोई समस्या है ट्रीसेट का उपयोग करके जहां आपको इसे हैश मैप के साथ प्रतिस्थापित करने की आवश्यकता है), लेकिन यह तय करने के बाद भी कि यह सूत्रों पर क्रैश हो जाता है।

हालांकि यह संभव है कि यह हैक किए गए कोड पर भरोसा करने के लिए एक डरावना प्रस्ताव है।

अपनी आवश्यकताओं/बजट के आधार पर आप गोली काटने और 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 कार्यपुस्तिकाएं, एक 15 एमबी कार्यपुस्तिका में संकलित)। डेमो मुफ्त है, यह आपको एक लाइसेंस खरीदने के लिए याद दिलाने वाली कार्यपुस्तिका में एक अतिरिक्त शीट रखता है।

5

मैंने पीओआई के साथ कुछ कार्यक्षमता लागू की है। कृपया अपने संदर्भ के लिए कोड देखें।

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(); 
    } 
} 
0

यह एक कार्यपुस्तिका से दूसरी कार्यपत्रियों की प्रतिलिपि बनाने का मेरा कार्यान्वयन है। यह समाधान मेरे लिए काम करता है। यह कोड काम करेगा यदि चादरों में टेबल नहीं हैं, आदि। यदि चादरों में सरल टेक्स्ट (स्ट्रिंग, बूलियन, इंट इत्यादि), सूत्र होते हैं, तो यह समाधान काम करेगा।

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();