Excel读取导入

1.创建文件读取的对象

DiskFileUpload fu = new DiskFileUpload();

注:DiskFileUpload 是 Apache Commons FileUpload 库中的一个类,它用于处理文件上传。然而,在最新版本的 Apache Commons FileUpload 库中,DiskFileUpload 已经被废弃,不再推荐使用。取而代之的是使用 DiskFileItemFactory

2.获取当前应用的真实路径

String path = application.getRealPath("").replace('\\','/');
if(!path.endsWith("/")){
	path += "/";
}

注:

application.getRealPath(""):获取 Web 应用的根目录的绝对路径。例如,如果应用部署在 C:\Tomcat\webapps\myapp 下,这将返回 C:\Tomcat\webapps\myapp

.replace('\\', '/'): 将路径中的所有反斜杠替换为正斜杠

path.endsWith("/"):检查 path 字符串是否以 / 字符结尾。如果是,返回 true;否则,返回 false

3.配置文件上传时的内存和磁盘存储策略

// 设置允许用户上传文件大小,单位:字节
fu.setSizeMax(10000000);
// maximum size that will be stored in memory?
// 设置最多只允许在内存中存储的数据,单位:字节
fu.setSizeThreshold(4096);
// 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
fu.setRepositoryPath(path+"/upload");

  1. fu.setSizeMax(10000000);

    • 功能: 设置允许上传的最大文件大小为 10,000,000 字节(约 10 MB)。超过这个大小的文件将被拒绝。
  2. fu.setSizeThreshold(4096);

    • 功能: 设置在内存中存储的最大数据量为 4,096 字节(4 KB)。如果上传的文件大小超过这个阈值,文件将不再完全存储在内存中,而是开始写入临时文件。
  3. fu.setRepositoryPath(path + "/upload");

    • 功能: 指定当文件大小超过 setSizeThreshold 设置时,数据应存储的目录路径。文件将被保存到这个目录中,避免占用过多的内存。

作用:

这些设置帮助平衡内存和磁盘使用:

  • 小文件将完全存储在内存中,提高性能。
  • 大文件将在超过阈值后转储到磁盘,防止过度占用内存。
  • 设置最大上传大小确保了系统的稳定性和安全性。

4.处理上传的文件

List fileItems = null;
try{
/**
*fu.parseRequest(request)是用来处理文件上传请求并解析请求中的文件和表单字段的代码。这段代码通常出现在 Java 的文件上传处理逻辑中,特别是在使用 Apache Commons FileUpload 库时。
*/
fileItems = fu.parseRequest(request);
}catch(FileUploadException e){
System.out.println("------------------:"+e);
}

//作用: 声明两个字符串变量 ImportPath 和 FileName,分别用于存储上传文件的路径和文件名。
String ImportPath = "";
String FileName = "";

// 依次处理每个上传的文件
//迭代器迭代集合
//作用: 获取 fileItems 列表的迭代器,以便遍历每个 FileItem 对象
Iterator iter = fileItems.iterator();

while (iter.hasNext())
{
    //作用: 遍历 fileItems 列表中的每个 FileItem 对象。
//FileItem item = (FileItem) iter.next();: 获取下一个 FileItem 对象,并进行类型转换。
	FileItem item = (FileItem) iter.next();

    //作用: 检查 FileItem 对象的字段名是否为 "ImportPath"。
	if (item.getFieldName().compareTo("ImportPath")==0)
	{
    //如果是,则处理这个字段(通常这是一个普通表单字段)。
     //ImportPath = item.getString();: 将字段值存储在 ImportPath 中,并打印出来。
		ImportPath = item.getString();
		System.out.println("上传路径:"+ImportPath);
	}
	//忽略其他不是文件域的所有表单信息
//item.isFormField()作用: 检查 FileItem 对象是否代表一个文件(即不是普通表单字段)。
//如果是文件,则执行文件处理逻辑。
	if (!item.isFormField())
	{
        //获取上传文件的原始文件名。
		String name = item.getName();
		System.out.println(name);
        //获取上传文件的大小
		long size = item.getSize();
        //如果文件名为空,文件大小为0,结束当次循环,执行下一个
		if((name==null||name.equals("")) && size==0)
			continue;

        //设置文件保存的路径
		ImportPath= path + "upload/";
        //将文件名中的反斜杠替换为正斜杠。
		FileName = name.replace('\\','/');
        //获取文件名的基本名称(去掉路径部分)
		FileName = FileName.substring(FileName.lastIndexOf("/") + 1);

		//保存上传的文件到指定的目录
        //作用: 尝试将上传的文件写入指定路径,并捕获可能发生的异常。
		try
		{
            // 使用 FileItem 的 write 方法将文件保存到 ImportPath + FileName 位置。
			item.write(new File(ImportPath + FileName));
			System.out.println("======ImportPath + FileName======" + ImportPath + FileName);
			count = 1;
		}
		catch(Exception e){
			System.out.println("upload file error ...");
		}
	}
}

处理文件上传请求并解析请求中的文件和表单字段的代码。这段代码通常出现在 Java 的文件上传处理逻辑中 

解析

  1. fu.parseRequest(request):

    • 功能: 这个方法用于解析传入的 HttpServletRequest 对象,并返回一个 List 对象,其中包含了所有上传的文件和表单字段。
    • 参数request 是一个 HttpServletRequest 对象,代表客户端提交的 HTTP 请求。
  2. List fileItems:

    • 类型fileItems 是一个 List 对象,包含了 FileItem 对象。每个 FileItem 对象代表了一个上传的文件或一个表单字段。
    • 作用: 你可以通过这个列表来遍历每个上传的文件和表单字段,并进行相应的处理。
  3. try-catch(){}
  •             作用: 尝试解析文件上传请求,并捕获 FileUploadException 异常。

5.数据传递

//将文件名,文件路径,和参数封装到tVData,并将tVData传递给逻辑处理层
tTransferData.setNameAndValue("FileName",FileName);
tTransferData.setNameAndValue("FilePath", path);
tTransferData.setNameAndValue("Xxx", Xxx);
tVData.add(tTransferData);
xxxximport.submitData(tVData,"");

6.读取文件内容

1.导包

import com.f1j.ss.BookModelImpl;

导入.jar包:f1j9swing.jar ,之后导包com.f1j.ss.BookModelImpl;,用于操作Excel文件

2.生成对象

private BookModelImpl m_book = new BookModelImpl();

3.读取文件

//在使用 f1jss 库读取 Excel 文件
// mImportFileName:文件路径
//new com.f1j.ss.ReadParams()读取文件时的参数设置
m_book.read(mImportFileName, new com.f1j.ss.ReadParams());

 4.获取指定sheet的最大行数

String sValue = m_book.getText(iSheet, iRow, 0);

解析:m_book.getText(iSheet, iRow, 0)

作用:获取一个sheet页,第iRow行的第一个单元格的内容

iSheet:代表第几个sheet页,计数时从0开始,0代表第一个sheet页

iRow:代表第几行,计数时从0开始,0代表第一行

最后一位;代表第几列,计数时从0开始,0代表第一个单元格

通过这三个参数可以确定,第几个sheet页的,第几个单元格,获取单元格里的值

 private int getMaxRow(int iSheet)
    {
        String sValue = "";
        String sValue01 = "";
        String sValue02 = "";
        String sValue03 = "";
        String sValue04 = "";
        String sValue05 = "";
        String sValue06 = "";
        int iRow;
        for (iRow = 0; iRow < 1000000; iRow++)
        {
            try
            {
                sValue = m_book.getText(iSheet, iRow, 0);
                sValue01 = m_book.getText(iSheet, iRow, 1);
                sValue02 = m_book.getText(iSheet, iRow, 2);
                sValue03 = m_book.getText(iSheet, iRow, 3);
                sValue04 = m_book.getText(iSheet, iRow, 4);
                sValue05 = m_book.getText(iSheet, iRow, 5);
                sValue06 = m_book.getText(iSheet, iRow, 6);
            }
            catch (Exception ex)
            {
                CError.buildErr(this, "数据读取错误!");
                return -1;
            }
            if ((sValue == null || sValue.trim().equals(""))&&(sValue01 == null || sValue01.trim().equals(""))&&(sValue02 == null || sValue02.trim().equals(""))&&(sValue03 == null || sValue03.trim().equals(""))&&(sValue04 == null || sValue04.trim().equals(""))&&(sValue05 == null || sValue05.trim().equals(""))&&(sValue06 == null || sValue06.trim().equals("")) )
            {
                break;
            }
        }
        System.out.println("最大行数iRow:"+iRow);
        return iRow;
    }

该Excel中有7列,获取一整行的单元格的值,若所有的单元格为空则代表,这一个行为空,表示这个sheet页中的内容结束,break结束循环,获得最大行数

5.组装获取的值

for (int iRow = 1; iRow < iMaxRow; iRow++) //逐行
        {
        	
        	String sValue[]=new String[7];
        	LLcqnegativedataSchema tLLcqnegativedataSchema = new LLcqnegativedataSchema();
            for (int iCol = 1; iCol <=7; iCol++) //逐列
            {
            	System.out.println("正在导入的是第'"+0+"'个SHEET的第'"+iRow+"'行中的第'"+iCol+"'列");
                try
                {                
                    sValue[iCol-1] = m_book.getText(0, iRow, iCol-1);              
                    
                }
                catch (Exception ex)
                {
                    CError.buildErr(this, "数据读取错误!");
                    
                }
                
            }

            //对每一个字段进行校验
            。。。
            。。。



            //将这条数据存入数据库
            。。。。
            。。。。
}

 根据获取的最大行数,重新进行遍历,获取当前行的内容

将每一个单元格的值取出,存放到一个数组中

对数组中的每一位的值进行校验是否符合规范

一个数组存一行数据,对应数据库的一个行

注:可能不适用所有的Excel导入 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值