Вставка значений из Excel для доступа к базе данных с использованием Java
Я использую этот код для импорта значений из файла Excel в базу данных Access. Все работает хорошо, за исключением того факта, что код будет читать все ячейки, но не будет копировать все в таблицу доступа.
(Например, 200 строк читаются успешно, но в базу данных вводится только 97, и код останавливается без ошибок.) Вводимое здесь описание содержит около 100 слов в строке.
public class selector extends javax.swing.JFrame {
final JFileChooser fc = new JFileChooser();
File file;
static String filename, query2, item;
static String[][] itemss = new String[10000][10000];
static double xxx;
static datacon dc = new datacon();
public static Statement st;
static int i, j, rows = -1, p;
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
try {
try {
// TODO add your handling code here:
fileChose();
} catch (SQLException ex) {
Logger.getLogger(selector.class.getName()).log(Level.SEVERE, null, ex);
} catch (FileNotFoundException ex) {
Logger.getLogger(selector.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (InvalidFormatException ex) {
Logger.getLogger(selector.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static String fileChose() throws InvalidFormatException, SQLException, FileNotFoundException {
JFileChooser fc = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("XLS files", "xls", "XLSX files", "xlsx");
fc.setFileFilter(filter);
int ret = fc.showOpenDialog(null);
if (ret == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
filename = file.getAbsolutePath();
System.out.println(filename);
work();
return filename;
} else {
return null;
}
}
static void work() throws InvalidFormatException, SQLException, FileNotFoundException {
try {
FileInputStream file = new FileInputStream(new File(filename));
org.apache.poi.ss.usermodel.Workbook workbook = WorkbookFactory.create(file);
org.apache.poi.ss.usermodel.Sheet sheet = workbook.getSheetAt(0);
Iterator<Row> rowIterator = sheet.iterator();
dc.connect();
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
rows++;
i = 0;
//For each row, iterate through all the columns
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell;
cell = cellIterator.next();
//Check the cell type and format accordingly
switch (cell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC:
xxx = cell.getNumericCellValue();
itemss[rows][i] = Double.toString(xxx);
break;
case Cell.CELL_TYPE_STRING:
item = "" + cell.getRichStringCellValue();
itemss[rows][i] = item;
break;
case Cell.CELL_TYPE_BLANK:
item = "" + cell.getRichStringCellValue();
itemss[rows][i] = item;
break;
}
System.out.println("coloumn " + i + " : " + itemss[rows][i]);
i++;
}
}
file.close();
for (j = 0; j < rows; j++) {
String query = " INSERT INTO schedule ([counter],[description]) VALUES ('" + j + "','" + itemss[j][1] + "') ";
st.executeUpdate(query);
System.out.println(query);
}
} catch (Exception e) {
}
}
public static class datacon {
public Connection con;
// public Statement st;
public ResultSet rs;
public void connect() {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:database4");
st = con.createStatement();
} catch (Exception t) {
System.out.println(t.toString());
}
}
}
}
2 ответа
Решение
Ваш запрос на вставку может выдавать исключения. Вы не регистрируете их:
for (j = 0; j < rows; j++) {
String query = " INSERT INTO schedule ([counter],[description]) VALUES ('" + j + "','" + itemss[j][1] + "') ";
st.executeUpdate(query);
System.out.println(query);
}
} catch (Exception e) {
//no logging
}
Также work()
объявил исключения, которые он может выдать, и все же вся реализация находится в try catch
Возможно, у вас есть проблема в вашем коде переключателя.
Добавьте значение по умолчанию и проверьте, передается ли код в этой части и какой тип ячейки.
что-то вроде этого:
default:
System.out.println("Default case: "+ cell.getCellType());