Java处理excel根据某列的值查询,并将结果显示在其他列中

这是公司项目,需要帮客户查询员工用餐消费记录中每个员工所在的部门,并填入部门这一列。(如图)

根据每个员工的卡号,查询所在部门,再填入部门这一列。下面是实现代码:(具体变量值请根据自身需要进行修改)

package cn.netmis.cmd;

import cn.netmis.cmd.other.Xls;import cn.netmis.core.util.DBUtils;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 java.io.*;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.ArrayList;import java.util.List;

/** * 操作excel表格 * 读取表格中的工号,同时查询该员工所在部门,填入 */public class operExcel {    private static final String XLS = "xls";    private static final String XLSX = "xlsx";

    /**     * 检查文件是否存在     * 并检查是否是xls或xlsx文件     * @param file     * @throws IOException     */    public static void checkFile(File file) throws IOException {        //判断文件是否存在        if(!file.exists()){            throw new FileNotFoundException("文件不存在");        }        //获取文件名        String fileName=file.getName();        //判断文件是否是excel文件        if (!fileName.endsWith(XLS)&&!fileName.endsWith(XLSX)){            throw new IOException(fileName+"不是excel文件");        }        System.out.println("文件存在且格式正确!");    }

    /**     * 获取表格     * @param file     * @return     * @throws IOException     */    public static Workbook getWookBook(File file) throws IOException {        //获取文件名        String fileName=file.getName();        //创建Workbook工作簿对象,表示整个excel        Workbook workbook=null;        //获取Excel文件的io流        InputStream is=new FileInputStream(file);        //根据文件后缀名不同,获得不通的Wookbook实现类对象        if(fileName.endsWith(XLS)){            workbook=new HSSFWorkbook(is);

        }else if(fileName.endsWith(XLSX)){            workbook=new XSSFWorkbook(is);        }

        return workbook;    }

    /**     * 获取一行中所有单元格的内容并存入集合     * @param file     * @return     * @throws IOException     */    public static List<String> getTableHanderList(File file,Connection yntv,String filePath,String fileName,Integer statIndex,Integer endIndex) throws IOException, SQLException {        checkFile(file);        Workbook wb=getWookBook(file);        List<String> handList=new ArrayList<>();        Sheet sheet=wb.getSheetAt(0);        Row row=null;        //循环获取所有员工的消费刷卡记录        //获取到工号并存入集合        for (int j=statIndex;j<endIndex;j++){            row=sheet.getRow(j);

            if(row==null){                return handList;            }

            Cell cell=row.getCell(3);//获取到表格中所有员工的工号            String cellVal=getCellValue(cell);            System.out.println("-------工号:"+cellVal);            //通过工号查询到该员工的部门            String bmmc=findBm(cellVal,yntv,handList);            System.out.println("-------bmmc:"+bmmc);

            Cell setCellVal=row.getCell(1);//要放入部门的列            setCellVal.setCellValue(bmmc);            setCellVal.setCellType(Cell.CELL_TYPE_STRING);            File file1=new File(filePath,fileName);            OutputStream out=new FileOutputStream(file1);            wb.write(out);

//            handList.add(getCellValue(cell));        }        return handList;    }

    /**     * 获取单元格的内容     * @param cell     * @return     */    public static String getCellValue(Cell cell){        String cellValue="";        if(cell==null){            return cellValue;        }        if(cell.getCellType()==cell.CELL_TYPE_NUMERIC){            cell.setCellType(cell.CELL_TYPE_STRING);        }        //判断类型        switch (cell.getCellType()){            case Cell.CELL_TYPE_NUMERIC: //数字                cellValue=String.valueOf(cell.getNumericCellValue()).trim();                break;            case Cell.CELL_TYPE_STRING: //字符串                cellValue=String.valueOf(cell.getStringCellValue()).trim();                break;        }        return cellValue;    }

    /**     * 通过工号查询部门并存入集合     * @param cellVal     * @param yntv     * @param handList     * @throws SQLException     */    public static String findBm(String cellVal,Connection yntv,List<String> handList) throws SQLException {        String sql = "select bmmc from sys_user where userno="+cellVal;        Statement st = yntv.createStatement();        ResultSet rs = st.executeQuery(sql);

        if (rs.next()){            return rs.getString("bmmc");        }        rs.close();        st.close();

        return null;    }

    public static void main(String [] args) throws IOException, SQLException {        Connection yntv = DBUtils.createConn("config/websql.properties");//        String fileName="hzst.xls";//食堂就餐卡刷卡挂账情况统计表(汉族)        String fileName="qzst.xls";//清真食堂就餐卡刷卡挂账情况统计表        String filePath="/home/ljc/Desktop/st/";//读取时的路径        String descfilePath="/home/ljc/Desktop/st/finishing";//修改后保存的路径        File file=new File(filePath,fileName);        Integer statIndex=3;//行数的开始        Integer endIndex=258;//行数的结束        List<String> cellVal=getTableHanderList(file,yntv,descfilePath,fileName,statIndex,endIndex);        for (String str:cellVal){            System.out.println(str);        }    }

}

原文地址:https://www.cnblogs.com/qfmy07/p/11009678.html

时间: 2024-07-30 17:47:56

Java处理excel根据某列的值查询,并将结果显示在其他列中的相关文章

Excel 使用单元格的值 查询MySQL数据库并返回数据给相应的单元格

Dim MyConn As ObjectPrivate Sub ConnectDB()Set MyConn = CreateObject("ADODB.Connection")    ----->创建连接对象Dim str As Stringstr = "DRIVER={MySQL ODBC 5.3 Unicode Driver};" & _   ---->拼接连接语句   odbc驱动 "SERVER=localhost;"

java编写一个含有100个随机值的文本,且从文本中读回数据并以升序显示数据

import java.io.*; import java.util.*; public class WriteArray { public static void main(String[] args) throws Exception { System.out.println("请输入文件名"); Scanner fileName=new Scanner(System.in); File file=new File(fileName.nextLine()); if(!file.ex

模拟Excel同一列相同值的单元格合并

背景 项目中有一个查询工作量,可以将查询的结果导出到Excel表中.在Excel工具中,有一个合并居中功能,可以将选中的单元格合并成一个大的单元格.现在需要在程序中直接实现查询结果的汇总, 问题分析 话不多说,上图分析: 如图,对于第一列,前三行的值都为A,那么就是需要执行合并.与此同时,1-3行后面的列采取同样的措施,约定前6列(下标0-5). 手动对1-3列进行分析的结果,如图,有点花哨!!! 可以看到结果中,对于整个1-3行后继的列操作依然如此. 这里要突出讲一下第3列(值为R),该列全部

怎样在一条sql语句中将第一列和第二列加和的值作为第三列的值

今天在写代码的时候,遇到的一个小问题,特意记下来,以免自己以后忘记了. 在一个表单里面,要表单的第一列和第二列的值查询出来,做和,作为第三列的值. select 1 as a,2 as b,(a+b) from dual;--这样写是会报错的 select 1 as a,2 as b,(1+2) from dual;--这样写是对的 由此可见,使用别名的方式是不行的. 原文地址:https://www.cnblogs.com/dongyaotou/p/11754294.html

删除DataTable重复列,只针对删除其中的一列重复的行

vs2005针对datatable已经有封装好的去重复方法: 1 //去掉重复行 2 DataView dv = table.DefaultView; 3 table = dv.ToTable(true, new string[] { "name", "code" }); 4 5 此时table 就只有name.code无重复的两行了,如果还需要id值则 6 7 table = dv.ToTable(true, new string[] { "id&quo

MySQL中不允许使用列别名作为查询条件

在MySQL中有个特殊的规定,即不允许使用列别名作为查询条件.比如有下面一个表: select     ID,     title,     concept,     conceptLength,     addUserId,     modifyTimefrom collections_wisdom 将SQL修改如下: select     ID+1 as newID,     title,     concept,     conceptLength,     addUserId,    

PowerDesigner显示Common注释列并自动赋值

PowerDesigner中默认不显示Common注释列,可根据以下步骤显示并紫东填充Name列内容. 1.显示Common注释列 2.运行VB Script脚本自动赋值 使用Shift+Ctrl+X快捷键打开脚本运行窗口,粘贴以下代码执行即可. 注:若Common列为空,则填充Name列内容:不为空则必不变. '如果comment为空,则填入name;如果不为空,则保留不变,避免已有的注释丢失. Option Explicit ValidationMode = True Interactive

myBatis中的注解@Param、返回值为Map、JAVA读取Excel并解析文本、Class.getResource()和ClassLoader.getResource()

myBatis中的注解@Param:http://blog.csdn.net/gao36951/article/details/44258217:  http://www.cnblogs.com/thomas12112406/p/6217211.html. myBatis返回值为Map:http://blog.csdn.net/werewr342352321df/article/details/11892755. ====================== JAVA读取Excel并解析文本:h

根据Excel列类型获取列的值

using System.Data; using System.IO; using System.Text; using System.Web; using NPOI.SS.UserModel; using NPOI.HSSF.UserModel; namespace AIMSCommon { public class ExcelRender { /// <summary> /// 根据Excel列类型获取列的值 /// </summary> /// <param name=