|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Feb 2014
Messaggi: 5
|
[JAVA] Scrivere su un file excel
Salve ragazzi,
Allora vi scrivo perchè ho un problema. Praticamente ho bisogno di scrivere su un file excel e ci sono delle condizioni,insomma per farla breve: se il file non esiste devo crearlo ma se esiste...devo poterci scrivere sopra senza sovrascrivere i dati...cioè devo riuscire ad aprire il workbook e scrivere dalla prima cella libera che trovo! Per ora ho provato in questo modo senza successo e senza venirne a capo: Codice:
file = new File(filename); System.out.println("File" + file.toString()); if(file.exists()) { JOptionPane.showMessageDialog(null, "Il file esiste!"); wb= Workbook.getWorkbook(file); sheet = hsswb.getSheet("Ticket"); int riga=1; int numRows= 0; numRows=sheet.getLastRowNum();//calcolo di quante righe sono valorizzate //SCRIVERE QUI!! Fare prova di scrittura! for(int i=numRows;i<10;i++) { Row row = sheet.createRow(i); Cell cell= row.createCell(0); cell.setCellValue("#"+i); } fileExist=true; } else { JOptionPane.showMessageDialog(null, "Il file non esiste!Quindi lo creo"); fileExist=false; OutputStream fileOutput = new FileOutputStream(file);//creazione del file hsswb.write(fileOutput); sheet=hsswb.createSheet("Ticket"); for(int i=0;i<10;i++) { Row row = sheet.createRow(i); Cell cell= row.createCell(0); cell.setCellValue("#"+i); } fileOutput.close(); } Magari mi sono perso in troppe chiacchiere! Riassumo tutto. Il mio obiettivo è fare questo programma che in caso non esista il file excel, lo crea! Nel caso in cui esista non deve crearne un altro, ma deve caricarsi il file già creato in precedenza e continuare a scriverci sopra senza sovrascrivere i dati! Spero che sia stato chiaro ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Esattamente cos'è che non funziona?
Personalmente, inoltre, farei in modo che se il file non esiste viene creato, poi, indipendentemente dal fatto che esistesse già o meno, andrei ad aggiungere i dati, in questo modo l'algoritmo viene più snello e facile da manutenere. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Ti ho scritto un programmino di esempio usando POI, nel quale apro una schermata per chiederti il nome del file da aprire. Dopo di che, una volta inserito il nome del file, faccio partire un nuovo thread, il quale apre il file (se esiste, altrimenti lo crea), cerca il primo sheet (se esiste, altrimenti lo crea), crea una nuova riga in fondo allo sheet ed inserisce un ottimo suggerimento nella prima cella, senza quindi sovrascrivere i dati.
Due avvertimenti: 1 - e' un programma di esempio e non volevo gestire tutti i formati; pertanto mi devi passare SEMPRE un file .xlsx; 2 - Vecchie versioni di POI avevano un bug nel salvataggio del workbook, pertanto assicurati di usare sempre l'ultimo aggiornamento. Te lo incollo qui: Codice:
package testexcel; import java.awt.BorderLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingUtilities; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class TestExcel extends JFrame { private JTextField tfFilename; public TestExcel() { buildGUI(); } private void buildGUI() { setTitle("Test Excel"); setSize(800, 150); setDefaultCloseOperation(EXIT_ON_CLOSE); JPanel mainPanel = new JPanel(); GridBagLayout layout = new GridBagLayout(); mainPanel.setLayout(layout); JLabel lbl = new JLabel("Excel file:"); addBag(mainPanel, layout, lbl, 0, 0, 0.0, 0.0, GridBagConstraints.NONE, 1, 1); tfFilename = new JTextField(); addBag(mainPanel, layout, tfFilename, 1, 0, 1.0, 0.0, GridBagConstraints.HORIZONTAL, 1, 1); JButton btnBrowse = new JButton("Browse..."); btnBrowse.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { JFileChooser chooser = new JFileChooser(); int returnVal = chooser.showOpenDialog(null); if(returnVal == JFileChooser.APPROVE_OPTION) tfFilename.setText(chooser.getSelectedFile().getPath()); } }); addBag(mainPanel, layout, btnBrowse, 2, 0, 0.0, 0.0, GridBagConstraints.NONE, 1, 1); getContentPane().add(mainPanel, BorderLayout.CENTER); JPanel southPanel = new JPanel(); JButton btnGo = new JButton ("Go"); btnGo.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { doDirtyJob(); } }); southPanel.add(btnGo); getContentPane().add(southPanel, BorderLayout.SOUTH); } private void doDirtyJob() { String filename = tfFilename.getText(); if (filename != null && filename.trim().length() > 0) { filename = filename.trim(); ExcelWorker worker = new ExcelWorker (this, filename); new Thread(worker).start(); } } private void addBag(JPanel panel, GridBagLayout layout, JComponent component, int gridx, int gridy, double weightx, double weighty, int fill, int gridWidth, int gridHeight) { GridBagConstraints limits = new GridBagConstraints(); limits.gridx = gridx; limits.gridy = gridy; limits.anchor = GridBagConstraints.WEST; limits.insets.top = 1; limits.insets.bottom = 1; limits.insets.left = 2; limits.insets.right = 2; limits.weightx = weightx; limits.weighty = weighty; limits.fill = fill; limits.gridwidth = gridWidth; limits.gridheight = gridHeight; layout.setConstraints(component, limits); panel.add(component); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { TestExcel te = new TestExcel(); te.setVisible(true); } }); } } class ExcelWorker implements Runnable { private final JFrame owner; private final String filename; public ExcelWorker (JFrame owner, String filename) { this.owner = owner; this.filename = filename; } private XSSFWorkbook loadExcelDocument (String name) throws IOException { try (FileInputStream fis = new FileInputStream (name)) { return new XSSFWorkbook(fis); } catch (FileNotFoundException e) { return new XSSFWorkbook(); } } private XSSFSheet getASheet (XSSFWorkbook xlsDoc) { int numSheets = xlsDoc.getNumberOfSheets(); if (numSheets <= 0) return xlsDoc.createSheet(); return xlsDoc.getSheetAt(0); } private void saveExcelDocument(String name, XSSFWorkbook xlsDoc) throws IOException { try (FileOutputStream fos = new FileOutputStream(filename)) { xlsDoc.write(fos); } } @Override public void run() { try { System.out.println ("Load document"); XSSFWorkbook xlsDoc = loadExcelDocument(filename); System.out.println ("Get a sheet"); XSSFSheet sheet = getASheet (xlsDoc); int lastRow = sheet.getLastRowNum(); lastRow++; XSSFRow row = sheet.createRow(lastRow); XSSFCell cell = row.createCell(0, Cell.CELL_TYPE_STRING); cell.setCellValue("Guarda la moneta, le tue palpebre si abbassano... quando mi svegliero' daro' un milione di euro a Sottovento"); System.out.println ("Now save"); saveExcelDocument(filename, xlsDoc); JOptionPane.showMessageDialog(owner, "Everything ok"); } catch (IOException e) { e.printStackTrace(System.out); JOptionPane.showMessageDialog(owner, "Exception in handling excel file: " + e); } } }
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#4 | |
Junior Member
Iscritto dal: Feb 2014
Messaggi: 5
|
Quote:
![]() E ti chiedo scusa ma solo ora ho provato il tuo programmino... e ho riscontrato un errore nell'apertura dei file .xlsx e in particolare l'errore è il seguente: Exception in thread "Thread-3" java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlException at ExcelWorker.loadExcelDocument(TestExcel.java:138) at ExcelWorker.run(TestExcel.java:170) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.ClassNotFoundException: org.apache.xmlbeans.XmlException at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 3 more Grazie in anticipo per un chiarimento ![]() |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Ho scritto l'applicazione usando poi, che quindi devi avere nel classpath.
Inoltre, poi usa delle altre librerie aggiuntive, ma non mi ricordo se sono gia' comprese in poi o se devi scaricare a parte, mi spiace. In particolare: - dom4j - xmlbeans - log4j Prova a verificare se hai tutti questi jar a disposizione. altrimenti, potrei zipparti e spedirti tutte le jar che ho usato per scrivere il programmino. Il problema e' che non ho voglia di leggere tutte le licenze e capire se questa operazione e' lecita. Cmq penso che si possa fare sicuramente se non ci sono problemi di distribuzione (tutto sommato e' solo un esempio, no?) BTW ho scritto l'esempio usando Netbeans, posso passarti tutto il progetto. Fammi sapere
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#6 | |
Junior Member
Iscritto dal: Feb 2014
Messaggi: 5
|
Quote:
![]() ![]() Grazie ancora per la tua disponibilità ![]() |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Ti ho spedito un messaggio in privato, fammi sapere
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#8 |
Junior Member
Iscritto dal: Feb 2014
Messaggi: 5
|
Scusa se ti disturbo ancora , grazie innanzitutto per la pazienza ... Ma nei mess privati non visualizzo nulla :/ forse non posso riceverli dato che sto qui sopra da poco?:/ o me lo hai inviato direttamente per e-mail?
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jul 2011
Messaggi: 381
|
Mi introduco furtivamente in questa discussione per sapere alcune cose: io ho lavorato con Excel e C# utilizzando i COM e quindi tutta la tediosa parte dei metodi dispose annessi
![]() Anche in Java è così? Come viene gestito il tutto?
__________________
Concluso positivamente con: Kamzata, Ducati82, Arus, TheLastRemnant, ghost driver, alexbull1, DanieleRC5, XatiX |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Ho lavorato con C# + excel, ma ho preferito riscrivere l'applicazione in Java perche' l'applicazione C# non funzionava sui computer dei colleghi nel caso avessero versioni diverse, ecc. Con java non mi sono mai capitati problemi simili. Parlo di esperienza personale, ovviamente....
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Il mio problema e' questo: siccome non ho molto tempo (e mi scuso per questo) ho messo nel classpath praticamente TUTTI i jar di POI. Molti di loro ovviamente non servono ma non mi sono mai preso la briga di capire quali. Per non causare problemi, dunque, sono obbligato a spedirti tutto il progetto, ma zippato risulta di 10 Mb! Pubblico qui il progetto Netbeans senza questi jar; se poi hai problemi, fammi sapere come possiamo scambiarci il materiale. Prova a spedirmi un messaggio privato, se ti va. ciao
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:00.