2017-12-11 2 views
0

Ich verwende NPOI. Ich lese in einer Excel-Arbeitsmappe mit zwei Blättern, die als "Vorlage" für die Ergebnisarbeitsmappe dient, die ich erzeugen werde. Blatt 0 ist abgesehen von einigen Kopfzeilen leer und Blatt 1 hat eine Reihe von Zeilen von Formeln. Die Formeln beziehen sich im Allgemeinen auf das Blatt 0 und ziehen Daten daraus.Zellformatierung nicht nach Formel

Ich kann nicht direkt in die Vorlagen-Arbeitsmappe schreiben, da ich die Zeilen aus dem Weg räumen müsste und es würde hässlich schnell werden, also erstelle ich im Code eine neue Ergebnis-Arbeitsmappe mit zwei Blättern. Basierend auf einer voreingestellten Konfigurationsdatei befülle ich das Blatt 0 dieser Ergebnis-Arbeitsmappe mit Daten, Zeile für Zeile, klone den Stil und die Formeln bestimmter Zeilen aus der Vorlagen-Arbeitsmappe. Blatt 0 endet mit Daten gefüllt, und Blatt 1 ist im Grunde eine Reihe von Formeln kopiert und relativ angepasst, in der Regel ziehen Daten von Blatt 0 mit einer kleinen Berechnung hier oder dort. Alle meine Daten in Blatt 0 sind Text und können nicht als Zahlen, Daten, etc. interpretiert werden. Also habe ich meine Daten Zelltypen als String festgelegt.

In Code I durchlaufen Sie dann alle Zellen in Blatt 1 und EvaluateInCell. Ich tue dies offensichtlich um die Formeln auszuwerten, aber auch um die Formeln zu entfernen und die kopierten/berechneten Ergebnisse zu belassen. Dies ist nur eine Voraussetzung für die Arbeit, die ich mache. Wir liefern die Endergebnisse und keine Formeln. Ich speichere die resultierende Arbeitsmappe.

Im Allgemeinen sehen die Dinge gut aus, außer wo ich Zellformatierung habe, scheint die Formatierung nicht angewendet zu werden. Die Formatierung ist da, wenn ich die Zellenformatierungseigenschaften in Excel bekomme. Zum Beispiel habe ich möglicherweise Textdaten, die ein Datum-Zeit in meinen Daten ist, die wie folgt angezeigt: 7/7/2016 9:54:55 AM Dies ist, was der ursprüngliche Datentext ist, aber auf meinem Formelblatt I habe ein benutzerdefiniertes Zellenformat yyyymmdd. Und noch, die Zelle zeigt immer noch: 7/7/2016 9:54:55 AM In Excel mache ich dann etwas wie den Wert manuell bearbeiten, zum Beispiel löschen Sie das letzte 'M' und wiederholen Sie 'M' und drücken Sie die Eingabetaste, diese Zelle ändert sich in das gewünschte Format und zeigt: Also wieder, die Formatierung ist da, es wird nur nicht angewendet.

Ich möchte Zellen nicht manuell bearbeiten oder nichts tun, sobald die Arbeitsmappe in Excel von meinen Kunden geöffnet wird. Ich möchte, dass die resultierende Arbeitsmappe mit den formatierten Werten geöffnet wird. Ich habe ein paar Dinge versucht, die wie ein Schuss im Dunkeln schien, wie:

this.ResultWorkbook.GetCreationHelper(). CreateFormulaEvaluator(). EvaluateAll(); ((XSSFWorkbook) this.ResultWorkbook) .SetForceFormulaRecalculation (true);

Aber das hat nicht geholfen. Irgendwelche Gedanken?

+0

"Zum Beispiel könnte ich Textdaten haben, die ein Datum-Uhrzeit ist": Datum-Uhrzeit-Werte sind kein Text in Excel, aber doppelte Werte mit der Ganzzahl Teil das Datum und der Bruchteil die Zeit (1/24 = 1h, 1/24/60 = 1min, 1/24/60/60 = 1s, ...). Und Excel wird Text nicht als Datum ** formatieren. Sie müssen also die Datum-Uhrzeit-Werte mit 'SetCellValue (DateTime-Wert) 'und nicht als String eingeben. –

+0

Leider darf mein Code die Daten nicht interpretieren. Es ist nur eine Zeichenfolge für meinen Code und ist das Ergebnis einer separaten Verarbeitung und kann nicht zur Laufzeit als Datum-Uhrzeit interpretiert werden. Manchmal sind die Daten bereits formatiert und manchmal nicht. Wenn dies nicht der Fall ist, ist die Excel-Zellenformatierung die Lösung. Dies funktionierte irgendwie, bevor ich den Excel-Interop-Code auspackte und zu NPOI wechselte. Ich bekomme, was Sie über SetCellValue sagen, aber das würde meinen Code benötigen, um zu wissen, was die Daten sind und das Format, in dem es bereits ist. Was es nicht tut. – Buzz

+0

"Leider darf mein Code die Daten nicht interpretieren." Leider kann ich dann nicht helfen. –

Antwort

0

ich bei der Vorlage der Suche endete Zelle der Excel-Datei, in die ich schreibe. Es sieht so aus, als wäre es nicht DateUtil.IsCellDateFormatted und das cellStyle.DataFormat ist nicht 0x31 (Text basierend auf BuiltInFormats), dann muss es numerisch sein. Basierend darauf versuche ich, meinen Text in DateTime umzuwandeln oder, falls zutreffend, zu doppelklicken und SetCellValue mit diesen konvertierten Variablen aufzurufen. Ansonsten schreibe ich den Text. Das scheint für Fälle zu funktionieren, die ich angetroffen habe.

0

können Sie entweder dieses apprioach versuchen, während die Formel für die Zelle Einstellung

Ansatz 1

ICellStyle dateCellStyle = workbook.CreateCellStyle(); 
dateCellStyle.DataFormat = workbook.CreateDataFormat().GetFormat("yyyymmdd"); // Or prefix single quote for data when writing it to excel file like 'yyymmdd ex: '20160707 

Ansatz 2

XSSFCellStyle dateCellStyle = (XSSFCellStyle)workbook.CreateCellStyle(); 
XSSFDataFormat dateDataFormat = (XSSFDataFormat)workbook.CreateDataFormat(); 
dateCellStyle.SetDataFormat(dateDataFormat.GetFormat("yyyymmdd"));