嗨,我想编写一个 Web 应用程序,它接受 excel 文件,然后将其转换为 csv 文件并将其上传到数据库,对此数据进行一些 sql 查询并将输出发送给用户。我在 Mac 中遇到了一个问题,它运行得很好,但在 Windows 上却抛出异常。抛出的异常是 java.sql.SQLSyntaxErrorException: ORA-00900。我已经检查了 SQL 查询,它应该可以工作,而且它在我的 mac 上工作得很好。所以我认为问题可能出在我的 csv 文件中。在Mac上,它将从Excel到csv的数据写入不同的列(单元格)中,但是当我使用Excel打开我的csv文件时,它会将所有内容写入一个单元格。所以我很困惑。有人可以帮我解决这个问题吗? 这是我的代码:
package dto;
import java.io.*;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import com.csvreader.CsvWriter;
import servlets.Serv1;
public class Converter {
public final String COMA_DELIMITER=" ,";
String newname;
public File converting(File file, String p){
Path path=Paths.get(file.getName());
String filename=path.getFileName().toString();
String extension = filename.substring(filename.lastIndexOf(".") + 1, filename.length());
if(extension.equals("csv"))
return file;
else if(extension.equals("xls")||extension.equals("xlsx")){
try{
newname=p+File.separator+filename.substring(0, filename.lastIndexOf("."))+".csv";
CsvWriter csvOutput=new CsvWriter(new FileWriter(newname,true), ',');
System.out.println("I am delimiter "+csvOutput.getDelimiter());
Workbook wb;
if(extension.equals("xls")){
wb=new HSSFWorkbook(new FileInputStream(file));
}
else{
wb = new XSSFWorkbook(new FileInputStream(file));
}
Sheet s=wb.getSheetAt(0);
Row row = null;
int j=0;
Integer val;
for(int i=0; i<s.getPhysicalNumberOfRows(); i++){
row=s.getRow(i);
Cell c=row.getCell(j);
if(c.getCellType()!=Cell.CELL_TYPE_NUMERIC)
continue;
else{
val=(int) c.getNumericCellValue();
csvOutput.write(Integer.toString(val));
//csvOutput.endRecord();
//csvOutput.write(String.valueOf((i+1)));
//csvOutput.endRecord();
}
csvOutput.write(String.valueOf((i+1)));
csvOutput.endRecord();
}
csvOutput.close();
wb.close();
return new File(newname);
}catch(Exception e){
e.printStackTrace();
return null;
}
}
return null;
}
public boolean insertIntoDb(File f){
if(f==null)
return false;
else{
String path=f.getAbsolutePath();
Connection conn=null;
Statement stmt=null;
try{
//System.out.println("Hello 1");
Class.forName("oracle.jdbc.driver.OracleDriver");
//System.out.println("Hello 2");
conn=(Connection) DriverManager.getConnection(
"jdbc:oracle:thin:@adress:orcl","almit","password");
//System.out.println("Hello 3");
stmt=conn.createStatement();
//System.out.println("Hello 4");
/*
* query = "LOAD DATA INFILE '"+filename+"' INTO TABLE testtable FIELDS
* TERMINATED BY ',' (text,price)";
*/
String select1="truncate table almit.TEMP_FOR_WORK";
//System.out.println("Hello 5");
stmt.execute(select1);
//System.out.println("Hello");
String select="LOAD DATA local INFILE '"+path+"' INTO TABLE TEMP_FOR_WORK FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'";
//System.out.println(select);
stmt.executeUpdate(select);
//System.out.println("Hello");
}catch(Exception e){
e.printStackTrace();
return false;
}finally{
try{
if(conn!=null)
conn.close();
if(stmt!=null)
stmt.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
return true;
}
}
我尝试了其他方法,但它们都输出到一列。我得到的结果是 |colomun1| |客户编号、id| 我想要得到的结果|第1列|第2列| |客户|id|
这可能吗?提前致谢!
最佳答案
部分问题可能是这样的:
以“\n”结尾的行
这在 Mac(Unix 机器)中是正确的,但是在 Windows 中,行以“\r\n”终止。
在我看来,您可以从 XSL 文件中提取 XML 数据并对 XML 文档进行解析并插入节点,而不是执行到 CSV 的转换。可能需要做更多的工作,但这将使您的应用程序平台独立。
祝你好运。
关于java - 如何将数据写入 csv 文件中的单独列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32516741/