java上传Excel文件,如何实现进度条显示?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java上传Excel文件,如何实现进度条显示?相关的知识,希望对你有一定的参考价值。

比如,Excel有100条数据,上传20条时显示20%,并且支持后面带“×”按钮,以结束上传。有知道留下联系方式,可以追加分。

参考技术A 您好,1、开发简单,由于要定时起一个HTTP 连接去获得进度信息,因此,发生的连接请求也增多 ,另外,在低速的情况下,常常会出各种各样的BUG,网络环境的差异,还造成那个周期很 难选择。 2、开发较复杂,COMET 本身需要服务器的支持,这样TOMCAT 至少得选6.0,否则服务器长连 接,压力肯定受不了,但是,性能相对好一些,由于一次上传实际上只启动了两个HTTP 链接 请求,比起AJAX 来说,那是要少很多请求了。另外一个优点是,COMET 将使得服务器可以主 动将进度情况汇报给客户端,因此,客户端的进度条相对来说,要准确一点。 3、目前看来解决方案最好的一个了,虽然开发需要涉及到 FLASH、javascript、以及 JAVA 的 开发,但是代码量都不是很多,因此,复杂程度相对属于中等程度。但是FLASH 也有几个问 题:第一、浏览器 FLASH 版本兼容问题,第二、FLASH 是通过获得发送数据的进度来体现进度 条的,因此虽然不需要服务器端开发进度部分的代码,但是进度的展现有些不是很准确,经 常会有一开始速度很快,但是后面越来越慢的情况。 4、就不说了,开发肯定是最麻烦的,但是进度条效果肯定是最好的,但要给每种浏览器都 要搞个插件,还是比较痛苦的。 总结一下,希望对大家有帮助。 2 其实很麻烦的,之前试过,会有下面几个问题: 第一、服务器端一定要选择支持HTTP 长连接的服务器,否则操作系统的线程限制,会导致并 发降低。 第二、除非原来就采用的是COMET 的进度方式,否则,你要把周期获得进度的方式,改成 COMET 的方式,那很郁闷的,COMET 要服务器主动把进度信息用JAVASCRIPT 的方式发回客户端 ,所以需要把结构转化为JAVASCRIPT 调用才行。 第三、对于不同的浏览器,处理 JAVASCRIPT 的方式是不一样的,我试验的结果是,IE 会在收 到一定数量的JAVASCRIPT 之后才执行,所以虽然我在服务器端每次都调用了flush 方法,但 是界面上还是需要等一段时间才能响应。而这段时间又不好控制了,因为上传文件大小的不 一样,导致了下发的JAVASCRIPT 数量也不一样,所以基本很难达到FLASH 那样的效果。 其实如果已经决定采用flash 了,那就不需要再去修改服务器端的代码了,因为那个进度信 息服务器发不发都不会影响到代码的执行,反正FLASH 本身已经提供了进度指示了,所以, 说简单地,要改成FLASH 上传,你直接做个FLASH 客户端就好了,不需要再改服务器端了。 对了,还有一种情况需要改服务器端,那就是FLASH 上传多个文件是采用多线程上传的,因 此如果你一次上传多个文件,那就需要改服务器端了。需要在所有线程上传完成的情况下, 再去修改数据库。追问

看清问题再回答好吗?

参考技术B pageoffice可以帮您实现的,参考看看 参考技术C 知道的 可以给你做出来 需要就see my name, find me追问

Q加你了,加上了,Q你没反应呢

java FTP上传文件(进度条显示进度)

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">java实现FTP上传有2种方式,一种是org.apache.commons.net.ftp.FTPClient这个jar包,一种是sun.net.ftp.FtpClient。不知道为什么,在使用前一种方式时,在遇到大批量的上传文件时总会抛出异常,我却找不出原因,所以使用的是后者。</span>
sun的FtpClient就在自带的system library中,如果程序找不到,Remove一下system library,再重新添加一次就好。
这边我套用的是别人封装好的方法进行上传的,只不过稍加修改,再上传之前计算了一下所选文件(夹)的总大小,然后单独开了一个线程每隔一段时间计算总的上传量,然后刷新swing界面UI。这边直接贴上FtpClient封装好后的类的代码:
java实现FTP上传有2种方式,一种是org.apache.commons.net.ftp.FTPClient这个jar包,一种是sun.net.ftp.FtpClient。不知道为什么,在使用前一种方式时,在遇到大批量的上传文件时总会抛出异常,我却找不出原因,所以使用的是后者。

sun的FtpClient就在自带的system library中,如果程序找不到,Remove一下system,再重新添加一遍就好。

下面主要贴上封装好的FtpUtils类的代码:

package com.fisee.ftp;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;

/**
 * ftp上传,下载
 * 
 * @author why 2009-07-30
 * 
 */
public class FtpUtils 

	private String ip = "";

	private String username = "";

	private String password = "";

	private int port = -1;

	private String path = "";

	FtpClient ftpClient = null;

	OutputStream os = null;

	FileInputStream is = null;
	
	public static long trans = 0;//已传输文件大小
	public static long totalSize = 0;//文件总大小

	public FtpUtils(String serverIP, int port, String username, String password) 
		this.ip = serverIP;
		this.username = username;
		this.password = password;
		this.port = port;
		trans = 0;
	

	/**
	 * 连接ftp服务器
	 * 
	 * @throws IOException
	 */
	public boolean connectServer() 
		ftpClient = new FtpClient();
		try 
			if (this.port != -1) 
				ftpClient.openServer(this.ip, this.port);
			 else 
				ftpClient.openServer(this.ip);
			
			ftpClient.login(this.username, this.password);
			if (this.path.length() != 0) 
				ftpClient.cd(this.path);// path是ftp服务下主目录的子目录
			
			ftpClient.binary();// 用2进制上传、下载
			System.out.println("已登录到\\"" + ftpClient.pwd() + "\\"目录");
			return true;
		 catch (IOException e) 
			e.printStackTrace();
			return false;
		
	

	/**
	 * 断开与ftp服务器连接
	 * 
	 * @throws IOException
	 */
	public boolean closeServer() 
		try 
			if (is != null) 
				is.close();
			
			if (os != null) 
				os.close();
			
			if (ftpClient != null) 
				ftpClient.closeServer();
			
			System.out.println("已从服务器断开");
			return true;
		 catch (IOException e) 
			e.printStackTrace();
			return false;
		
	

	/**
	 * 检查文件夹在当前目录下是否存在
	 * 
	 * @param dir
	 * @return
	 */
	private boolean isDirExist(String dir) 
		String pwd = "";
		try 
			pwd = ftpClient.pwd();
			ftpClient.cd(dir);
			ftpClient.cd(pwd);
		 catch (Exception e) 
			return false;
		
		return true;
	

	/**
	 * 在当前目录下创建文件夹
	 * 
	 * @param dir
	 * @return
	 * @throws Exception
	 */
	private boolean createDir(String dir) 
		try 
			ftpClient.ascii();
			StringTokenizer s = new StringTokenizer(dir, "/"); // sign
			s.countTokens();
			String pathName = ftpClient.pwd();
			while (s.hasMoreElements()) 
				pathName = pathName + "/" + (String) s.nextElement();
				try 
					ftpClient.sendServer("MKD " + pathName + "\\r\\n");
				 catch (Exception e) 
					e = null;
					return false;
				
				ftpClient.readServerResponse();
			
			ftpClient.binary();
			return true;
		 catch (IOException e1) 
			e1.printStackTrace();
			return false;
		
	

	/**
	 * ftp上传 如果服务器段已存在名为filename的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
	 * 
	 * @param filename
	 *            要上传的文件(或文件夹)名
	 * @return
	 * @throws Exception
	 */
	public boolean upload(String filename) 
		String newname = "";
		if (filename.indexOf("/") > -1) 
			newname = filename.substring(filename.lastIndexOf("/") + 1);
		 else 
			newname = filename;
		
		return upload(filename, newname);
	

	/**
	 * ftp上传 如果服务器段已存在名为newName的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
	 * 
	 * @param fileName
	 *            要上传的文件(或文件夹)名
	 * @param newName
	 *            服务器段要生成的文件(或文件夹)名
	 * @return
	 */
	public boolean upload(String fileName, String newName) 
		try 
			/*String savefilename = new String(fileName.getBytes("ISO-8859-1"),
					"GBK");*/
			String savefilename = fileName;
			File file_in = new File(savefilename);// 打开本地待长传的文件
			if (!file_in.exists()) 
				throw new Exception("此文件或文件夹[" + file_in.getName() + "]有误或不存在!");
			
			if (file_in.isDirectory()) 
				upload(file_in.getPath(), newName, ftpClient.pwd());
			 else 
				uploadFile(file_in.getPath(), newName);
			

			if (is != null) 
				is.close();
			
			if (os != null) 
				os.close();
			
			return true;
		 catch (Exception e) 
			e.printStackTrace();
			System.err.println("Exception e in Ftp upload(): " + e.toString());
			return false;
		 finally 
			try 
				if (is != null) 
					is.close();
				
				if (os != null) 
					os.close();
				
			 catch (IOException e) 
				e.printStackTrace();
			
		
	

	/**
	 * 真正用于上传的方法
	 * 
	 * @param fileName
	 * @param newName
	 * @param path
	 * @throws Exception
	 */
	private void upload(String fileName, String newName, String path)
			throws Exception 
		//String savefilename = new String(fileName.getBytes("ISO-8859-1"), "GBK");
		String savefilename = fileName;
		File file_in = new File(savefilename);// 打开本地待长传的文件
		if (!file_in.exists()) 
			throw new Exception("此文件或文件夹[" + file_in.getName() + "]有误或不存在!");
		
		if (file_in.isDirectory()) 
			if (!isDirExist(newName)) 
				createDir(newName);
			
			ftpClient.cd(newName);
			File sourceFile[] = file_in.listFiles();
			for (int i = 0; i < sourceFile.length; i++) 
				if (!sourceFile[i].exists()) 
					continue;
				
				if (sourceFile[i].isDirectory()) 
					this.upload(sourceFile[i].getPath(),
							sourceFile[i].getName(), path + "/" + newName);
				 else 
					this.uploadFile(sourceFile[i].getPath(),
							sourceFile[i].getName());
				
			
		 else 
			uploadFile(file_in.getPath(), newName);
		
		ftpClient.cd(path);
	

	/**
	 * upload 上传文件
	 * 
	 * @param filename
	 *            要上传的文件名
	 * @param newname
	 *            上传后的新文件名
	 * @return -1 文件不存在 >=0 成功上传,返回文件的大小
	 * @throws Exception
	 */
	public long uploadFile(String filename, String newname) throws Exception 
		long result = 0;
		TelnetOutputStream os = null;
		FileInputStream is = null;
		try 
			java.io.File file_in = new java.io.File(filename);
			if (!file_in.exists())
				return -1;
			os = ftpClient.put(newname);
			result = file_in.length();
			is = new FileInputStream(file_in);
			byte[] bytes = new byte[1024];
			int c;
			while ((c = is.read(bytes)) != -1) 
				os.write(bytes, 0, c);
				trans = trans + c;			
			
		 finally 
			if (is != null) 
				is.close();
			
			if (os != null) 
				os.close();
			
		
		return result;
	

	/**
	 * 从ftp下载文件到本地
	 * 
	 * @param filename
	 *            服务器上的文件名
	 * @param newfilename
	 *            本地生成的文件名
	 * @return
	 * @throws Exception
	 */
	public long downloadFile(String filename, String newfilename) 
		long result = 0;
		TelnetInputStream is = null;
		FileOutputStream os = null;
		try 
			is = ftpClient.get(filename);
			java.io.File outfile = new java.io.File(newfilename);
			os = new FileOutputStream(outfile);
			byte[] bytes = new byte[1024];
			int c;
			while ((c = is.read(bytes)) != -1) 
				os.write(bytes, 0, c);
				result = result + c;
			
		 catch (IOException e) 
			e.printStackTrace();
		 finally 
			try 
				if (is != null) 
					is.close();
				
				if (os != null) 
					os.close();
				
			 catch (IOException e) 
				e.printStackTrace();
			
		
		return result;
	

	/**
	 * 取得相对于当前连接目录的某个目录下所有文件列表
	 * 
	 * @param path
	 * @return
	 */
	public List getFileList(String path) 
		List list = new ArrayList();
		DataInputStream dis;
		try 
			dis = new DataInputStream(ftpClient.nameList(this.path + path));
			String filename = "";
			while ((filename = dis.readLine()) != null) 
				list.add(filename);
			
		 catch (IOException e) 
			e.printStackTrace();
		
		return list;
	

	public static void main(String[] args) 
		FtpUtils ftp = new FtpUtils("192.168.1.100", 8833, "ScumVirus",
				"123456");
		ftp.connectServer();
		boolean result = ftp.upload("E:/11game", "");
		System.out.println(result ? "上传成功!" : "上传失败!");
		ftp.closeServer();
		/**
		 * FTP远程命令列表 USER PORT RETR ALLO DELE SITE XMKD CDUP FEAT PASS PASV STOR
		 * REST CWD STAT RMD XCUP OPTS ACCT TYPE APPE RNFR XCWD HELP XRMD STOU
		 * AUTH REIN STRU SMNT RNTO LIST NOOP PWD SIZE PBSZ QUIT MODE SYST ABOR
		 * NLST MKD XPWD MDTM PROT
		 * 在服务器上执行命令,如果用sendServer来执行远程命令(不能执行本地FTP命令)的话,所有FTP命令都要加上\\r\\n
		 * ftpclient.sendServer("XMKD /test/bb\\r\\n"); //执行服务器上的FTP命令
		 * ftpclient.readServerResponse一定要在sendServer后调用
		 * nameList("/test")获取指目录下的文件列表 XMKD建立目录,当目录存在的情况下再次创建目录时报错 XRMD删除目录
		 * DELE删除文件
		 */
	


刷新进度条线程:

//刷新进度条线程
class ProgressThread extends Thread 
	private JProgressBar progressBar;

	public ProgressThread(JProgressBar progressBar) 
		this.progressBar = progressBar;
	

	public void run() 
		while (flag) 
			int k = (int) (FtpUtils.trans * 100 / FtpUtils.totalSize);
			progress.setValue(k);
			try 
				Thread.sleep(1000);
			 catch (InterruptedException e) 
				e.printStackTrace();
			
		
	
界面效果图

附上源码:点击下载




以上是关于java上传Excel文件,如何实现进度条显示?的主要内容,如果未能解决你的问题,请参考以下文章

java多文件上传显示进度条

前端上传文件实时显示进度条和上传速度的工作原理是怎样的?

java FTP上传文件(进度条显示进度)

java FTP上传文件(进度条显示进度)

java FTP上传文件(进度条显示进度)

文件上传和进度条