View Full Version : [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:
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();
}
Il codice è completamente errato...cioè spero che si capisca ciò che voglio fare! Insomma se il file esiste apro il workbook con la classe Workbook e poi mi prendo il foglio con l'oggetto HSSFWorkbook hsswb,però ovviamente questo non serve a nulla!. Praticamente stavo cercando di usare le librerie "jxl" e "poi" ma non riesco a usarli insieme!
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 :D Grazie
Daniels118
07-02-2014, 07:32
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.
sottovento
07-02-2014, 12:58
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:
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);
}
}
}
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:
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);
}
}
}
Innanzitutto grazie mille per la disponibilità :D
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 :D
sottovento
12-02-2014, 04:28
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
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
Scusa se ti rispondo tardi :( Comunque si sarei felice se mi passassi l'intero progetto così me lo studio meglio :D
Grazie ancora per la tua disponibilità :D
sottovento
16-02-2014, 14:59
Scusa se ti rispondo tardi :( Comunque si sarei felice se mi passassi l'intero progetto così me lo studio meglio :D
Grazie ancora per la tua disponibilità :D
Ti ho spedito un messaggio in privato, fammi sapere
Ti ho spedito un messaggio in privato, fammi sapere
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?
starfred
22-02-2014, 08:47
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?
sottovento
22-02-2014, 10:07
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?
No, assolutamente! Ti basta usare Apache POI che e' molto semplice, oppure jxl, o altro ancora.
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....
sottovento
22-02-2014, 10:24
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?
Non avevo visto il tuo messaggio, scusa. Si, ti avevo spedito un messaggio privato, qui di hwupgrade.
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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.