java - 如何将数据写入 csv 文件中的单独列

标签 java excel oracle csv

嗨,我想编写一个 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/

相关文章:

java - 在 Android 中从 SQLite 填充 TextViews 和按钮

java - KafkaProducer不发送记录

java - 如果先使用 db.delete,Android db.update 将不起作用

Java 用样式创建 Excel

sql - INSERT 语句上的 "Not a valid month"

oracle - 将 SQL 类型转换为 PL SQL 集合/将一种集合类型转换为另一种

java - Java 条件编译 : will compiler omit "always false" blocks from class?

excel - 想要通过 PL/SQL 将两个 Excel 工作表作为邮件附件

c# - 使用模式匹配来匹配具有非零下限的数组

用于基于 ARM 的 Debian 设备的 Oracle Instant Client