Скопируйте имена определений из файла /xl/workbook.xml( или файл Excel) в новый файл Excel - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть файл Excel, который содержит столбец списка, и эти данные списка считываются из другого справочного листа.Итак, я создал несколько ячеек с именем на рабочей книге, как это.

private void addListReferenceToHiddenSheet(String key,String[] vallist){
    int initialRowNumber = refCellCount;
    Name name = sxssfWorkbook.getName(getNamedListName(key));
    if(name == null) {
        for (String val : vallist) {
            Row row = listRefSheet.createRow(refCellCount);
            Cell celll = row.createCell(0);
            celll.setCellValue(val);
            refCellCount++;
        }
        Name namedCell = sxssfWorkbook.createName();
        namedCell.setNameName(getNamedListName(key));
        String reference = LIST_REFERENCE_SHEET_NAME + "!$A$" + (initialRowNumber + 1) + ":$A$" + refCellCount + "";
        namedCell.setRefersToFormula(reference);
    }
}

И затем я помещаю это в подтверждение данных следующим образом:

   pushListToReferenceSheet(key,vallist);
                /*Adding reference from hidden sheet and validation*/
                dvc = dvHelper.createFormulaListConstraint(getNamedListName(key));
                dv = dvHelper.createValidation(dvc, listConstraintMap.get(key));  

Но я хочу скопировать эту книгу на другую,Да, это может быть на основе событий SXSSF.Но эти события просто читают лист, как этот.

public void processSheet(StylesTable styles,
                         ReadOnlySharedStringsTable strings, InputStream sheetInputStream)
        throws IOException, ParserConfigurationException, SAXException {
    SheetModel sheetModel = new SheetModel();
    sheetModel.setNumberOfColumns(0);
    sheetModel.setNumberOfRows(0);
    long startTime = System.currentTimeMillis();
    InputSource sheetSource = new InputSource(sheetInputStream);
    SAXParserFactory saxFactory = SAXParserFactory.newInstance();
    SAXParser saxParser = saxFactory.newSAXParser();
    XMLReader sheetParser = saxParser.getXMLReader();
    ContentHandler handler = new XSSFSheetEventHandler(styles, strings,
            this.minColumns,  sheetModel);
    sheetParser.setContentHandler(handler);
    sheetParser.parse(sheetSource);
    sheetModel.setTimeToProcess(System.currentTimeMillis() - startTime);
    System.out.println("Number Of Rows : "+ sheetModel.getNumberOfRows());
    System.out.println("Time to process : "+ sheetModel.getTimeToProcess());
}

Это просто итерация событий листа, но рабочая книга содержит некоторые finedNames , которые находятся в / xl / workbook.xml

<definedNames><definedName name="LIST___CURRENCY">LIST_REFERENCE!$A$1:$A$105</definedName><definedName name="LIST_Test_List">LIST_REFERENCE!$A$106:$A$157</definedName><definedName name="LIST_HaulageModeOfTransport">LIST_REFERENCE!$A$158:$A$162</definedName><definedName name="_xlnm._FilterDatabase" localSheetId="2" hidden="true">TRYRTJV_11_OCEAN_FREIGHTS!$A$2:$AD$57</definedName><definedName name="_xlnm._FilterDatabase" localSheetId="3" hidden="true">'REOCEAN_NOV-14_2'!$A$2:$AS$180</definedName></definedNames></workbook>

Я не понимаю, как читать определения имен для моей новой книги или файла Excel.Я делаю это, читая / xl / workbook.xml отдельно.Это правильный способ клонировать определения имен из одного Excel в другое.

private void readAndPopulateWorkbookData() throws IOException, XMLStreamException {

        PackagePart workbookpart = xlsxPkg.getPartsByName(Pattern.compile("/xl/workbook.xml")).get(0);

        XMLEventReader reader = XMLInputFactory.newInstance().createXMLEventReader(workbookpart.getInputStream());

        boolean isInDefinedName = false;
        String definedNameName = "";
        StringBuffer definedNameFormula = new StringBuffer();

        while(reader.hasNext()){
            XMLEvent event = (XMLEvent)reader.next();

            if(event.isStartElement()) {
                StartElement startElement = (StartElement)event;
                QName startElementName = startElement.getName();
                if (startElementName.getLocalPart().equalsIgnoreCase("definedName")) {
                    Attribute attribute = startElement.getAttributeByName(new QName("name"));
                    definedNameName = attribute.getValue();
                    isInDefinedName = true;
                }
            } else if(event.isCharacters() && isInDefinedName) {
                definedNameFormula.append(((Characters)event).getData());
            } else if(event.isEndElement()) {
                EndElement endElement = (EndElement)event;
                QName endElementName = endElement.getName();
                if(endElementName.getLocalPart().equalsIgnoreCase("definedName")) {
                    if(!definedNameName.equalsIgnoreCase("_xlnm._FilterDatabase")) {
                        Name name = outWorkbook.createName();
                        name.setNameName(definedNameName);
                        name.setRefersToFormula(definedNameFormula.toString());
                    }
                    definedNameFormula = new StringBuffer();
                    isInDefinedName = false;
                }
            }

        }
    }
...