2017-09-08 1 views
0

Ich verwende NPOI-Bibliothek, um eine vorhandene Arbeitsmappe einzulesen und eine neue Arbeitsmappe zu erstellen. Beim Erstellen eines HSSFsheet. Ich sehe, dass es eine Methode namens SetZoom gibt. Was ich nicht sehe, ist eine GetZoom-Methode oder eine Zoom-Eigenschaft, um zu ermitteln, welche Zoomstufe sich auf dem vorhandenen Arbeitsblatt befindet. Irgendwelche Ideen?NPOI GetZoom des Arbeitsblatts

+0

Wenn Sie Ihr vorhandenes Arbeitsblatt laden, die Sie wissen, dass ein Nicht-Standard-Zoom hat (zB 75%), eine Änderung vornehmen um es zu speichern, speichert die resultierende Datei den gleichen Zoom oder setzt es auf 100% zurück? –

+0

Ich habe dies nicht im Code versucht, aber wenn Sie MS Excel öffnen, stellen Sie Ihren Zoom auf Nicht-Standard, speichern Sie das Dokument, und schließen Sie es - dann - Ja - das nächste Mal, wenn Sie es öffnen, wird der Zoom immer noch erinnern Ihre nicht standardmäßige Einstellung. –

Antwort

1

Dies wird keine befriedigende Antwort sein, da ich mir nicht sicher bin, ob es eine gibt. Ich habe den NPOI-Quellcode (SetZoom() in line 1161) sowie den ursprünglichen Java-Quellcode durchsucht, von dem der Port portiert wurde (SetZoom() in line 1083). Wie Sie sehen können, erstellt das SetZoom() Methode einfach ein SCLRecord:

SCLRecord sclRecord = new SCLRecord(); 
      sclRecord.Numerator = ((short)numerator); 
      sclRecord.Denominator = ((short)denominator); 
      Sheet.SetSCLRecord(sclRecord); 

und Graben weiter (in der ursprünglichen Java):

public void setSCLRecord(SCLRecord sclRecord) { 
    int oldRecordLoc = findFirstRecordLocBySid(SCLRecord.sid); 
    if (oldRecordLoc == -1) { 
     // Insert it after the window record 
     int windowRecordLoc = findFirstRecordLocBySid(WindowTwoRecord.sid); 
     _records.add(windowRecordLoc+1, sclRecord); 
    } else { 
     _records.set(oldRecordLoc, sclRecord); 
    } 
} 

Wo wir sehen können, dass sie diese Informationen in einem privaten Bereich spart von ISheet (InternalSheet in Java): So

private List<RecordBase> _records; 

, sind diese Informationen nicht öffentlich zugänglich. Wenn der Zoom nicht gesetzt ist, ist er standardmäßig auf 100% eingestellt, aber ich weiß nicht, wie man auf den Zoom eines vorhandenen Blattes zugreifen kann, da es anscheinend keine Möglichkeit gibt, dies in NPOI zu tun, ohne den Zoom zu ändern interner Quellcode selbst Dies würde Ihnen jedoch nur die Zoomstufe geben, die Sie festgelegt haben, im Gegensatz zu der bereits vorhandenen Zoomstufe auf dem Arbeitsblatt.

Es könnte in EPPlus möglich sein, wenn Sie auf die zugreifen, aber ich kann dies derzeit nicht testen.

+0

Denkst du, es wäre möglich, eine Override-Klassenmethode zu erstellen, um NPOI zu vergrößern und zu vergrößern? EPPlus eignet sich hervorragend für XLSX, aber nicht für XLS. –

+0

@DavidP Das Problem ist, dass ich nicht sicher bin, wie Sie den Zoom anfänglich erhalten, also weiß ich nicht, wie Sie eine solche Methode schreiben würden. Ich denke, der Zoom wird irgendwo außerhalb der Excel-Tabelle gespeichert, etwa als Windows-Einstellung oder so. Tut mir leid, ich könnte nicht mehr helfen. –

+0

Ich vermutete, dass Sie nicht richtig gedacht haben, dass sie in einem Registrierungsschlüssel oder einer Windows-Einstellung gespeichert wurde. Wenn Sie in Excel ein benutzerdefiniertes Zoom für ein Arbeitsblatt festlegen, schließen Sie die Datei, kopieren Sie die Datei in ein neues benanntes Dokument, und öffnen Sie das neu benannte Dokument. Es merkt sich weiterhin den benutzerdefinierten Zoom. Aber basierend auf Ihrer Eingabe habe ich die Lösung gefunden. Siehe unten. –

1

Dank C. Helling konnte ich daraus schließen, dass der Zoom im Window2 gespeichert wurde. Es wird jedoch als Ganzzahl gespeichert (z. B. - 65 für 65%, 150 für 150%). Einstellen des Zoom des neuen Arbeitsblatt basierend aus der Zoom der alten Blatt, ist recht einfach:

destWS.SetZoom(sourceWS.Sheet.WindowTwo.NormalZoom, 100) 
+0

Schön! Ich bin froh, dass du es herausgefunden hast. –

Verwandte Themen