精华内容
下载资源
问答
  • Java 实现 Excel数据库数据转换

    千次阅读 2018-08-22 15:51:35
    一、准备 (一)环境 需要用到下面两个jar包,可以自行到网上下载或者我提供...二、数据库中的数据导入 Excel (一)原理 通过调用工具类,先判断在服务器中指定的文件夹中有没有存在同名的 excle 表,有的话...

     

    一、准备

    (一)环境

    需要用到下面两个jar包,可以自行到网上下载或者从我提供的百度云链接下载。

    链接: https://pan.baidu.com/s/1pFLM7VEKM4WNSQ3FBbHKXQ 提取码: bhje 

    (二)数据库

    二、数据库中的数据导入 Excel

    (一)原理

    通过调用工具类,先判断在服务器中指定的文件夹中有没有存在同名的 excle 表,有的话就先删除掉,没有的话,就在指定的文件夹中生成一份新的 excle 表格,再调用浏览器的下载接口,把 excle 表下载到自己电脑上的指定位置,然后删除掉服务器上的 excle 表格。

    (二)源码

    1. MakeExcel:自定义的工具类

    package com.utils;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletResponse;
    
    import jxl.Sheet;
    import jxl.Workbook;
    import jxl.format.Alignment;
    import jxl.format.Border;
    import jxl.format.BorderLineStyle;
    import jxl.format.VerticalAlignment;
    import jxl.read.biff.BiffException;
    import jxl.write.Label;
    import jxl.write.WritableCellFormat;
    import jxl.write.WritableFont;
    import jxl.write.WritableSheet;
    import jxl.write.WritableWorkbook;
    import jxl.write.WriteException;
    
    public class MakeExcel {
    
    	/**
    	 * 创建 excel 表格
    	 * 
    	 * @param list
    	 *            一条数据存一个map对象,map对象中存列和值得对应关系
    	 * @param destFile(目标文件)
    	 *            当然就是要存的文件信息,即表格保存的路径
    	 * @param headList
    	 *            很重要,它是列的展示,当然和数据的列要对应不然找不到对应的地方存储
    	 * @param message
    	 *            表格第一行的表头信息
    	 * @throws WriteException
    	 * @throws IOException
    	 */
    	public static void CreateExcelFile(List<Map<String, Object>> list, File destFile, List<String> headList,
    			String message) throws WriteException, IOException {
    		// 获取传入 list 的大小,即有多少条数据
    		int sizeAll = list.size();
    		// 设置每页最大条数 65534 ,求出整数页 wholeNumber
    		int wholeNumber = sizeAll / 65534;
    		// 求出最后一页的条数
    		int yu = sizeAll % 65534;
    		// sheetSize:表示页数
    		// flagList:循环参数,后面输出数据的时候用到
    		int sheetSize = 1;
    		int flagList = 1;
    		// 判断要导出的数据需要存放在几页的 excel 表上
    		if (sizeAll <= 65534) {
    			sheetSize = 1;
    		} else {
    			if (yu > 0) {
    				sheetSize = wholeNumber + 1;
    			} else {
    				sheetSize = wholeNumber;
    			}
    		}
    		// 用 WritableWorkbook 创建一个可读写的工作簿
    		WritableWorkbook book = null;
    		// 以 destFile 为文件名来创建一个 workbook
    		// createWorkbook() : 参数 destFile 为 new File(D:/example.xls)
    		book = Workbook.createWorkbook(destFile);
    		//
    		if (list.size() == 0) {
    			// list 中没有数据,直接操作空的工作簿
    			// 写进文档
    			book.write();
    		} else {
    			for (int j = 0; j < sheetSize; j++) {
    				int index;
    				System.out.println("*****sheet(excle的左下角)" + j + "*****");
    				// 创建工作表( excel 中的 sheet 表)
    				// createSheet(String str,int n)
    				// String 型参数 str 为 sheet 表的名字,一般命名为"sheet0"或"sheet1"即可
    				// int 型参数 n 代表sheet号,0是第一页,1是第二页,依次类推,打开Excel表格在底端可以看到
    				WritableSheet sheet = book.createSheet(destFile.getName().replace(".xls", "") + j, j);
    
    				// ARIAL : 字体样式 【WritableFont.createFont("宋体") : 宋体字体的设置】
    				// WritableFont.TIMES
    				// 19 :字体大小
    				// WritableFont.BOLD, false 是判断是否为斜体,选择true时为斜体 ,默认为 false
    				WritableFont BoldFont = new WritableFont(WritableFont.createFont("宋体"), 18);
    				WritableCellFormat wcf_center = new WritableCellFormat(BoldFont);
    				wcf_center.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
    				wcf_center.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
    				wcf_center.setAlignment(Alignment.CENTRE); // 文字水平对齐
    				wcf_center.setWrap(false); // 文字是否换行
    				// wcf_center.setBackground(Colour.LIGHT_GREEN);// 单元格背景颜色
    				for (int i = 0; i < headList.size() + 1; i++) {
    					sheet.setColumnView(i, 20);// 设置第i列的宽度
    				}
    				// 合并首行,设置首行信息
    				// Label():第一个参数表示第几列,第二个参数表示第几行
    				// Label(0, 0, message,wcf_center):表示第0列第0行
    				// message:填入表格的信息
    				// wcf_center:表格样式
    				sheet.mergeCells(0, 0, headList.size() - 1, 0);
    				sheet.addCell(new Label(0, 0, message, wcf_center));
    
    				// 输出列名
    				index = 0;
    				for (String name : headList) {
    					// 上面合并了首行,所有这里在第二行开始输出列名
    					sheet.addCell(new Label(index, 1, name, wcf_center));
    					index++;
    				}
    
    				// 输出数据
    				// i:表示输出的数据为第 i 条
    				// t:表示在 excle 中的第 t+1 行输出数据
    				int i = 0;
    				int t = 2;
    				// flagList 初始值为1,作为循环变量
    				// 当 flagList 大于需要输出的数据条数时,则终止循环
    				while (flagList <= list.size()) {
    					index = 0;
    					if (i < 65534) {
    						for (String name : headList) {
    							sheet.addCell(new Label(index, t, list.get(flagList - 1).get(name) + "", wcf_center));
    							index++;
    						}
    						i++;
    						t++;
    						flagList++;
    					} else {
    						break;
    					}
    				}
    			}
    		}
    		// 写入文档
    		book.write();
    		if (book != null) {
    			// 关闭Excel工作簿对象
    			book.close();
    		}
    	}
    
    	/**
    	 * 调用浏览器接口进行文件下载
    	 *
    	 * @param filepath
    	 *            文件路径
    	 * @param response
    	 */
    	public static void send(String filepath, HttpServletResponse response) {
    		try {
    			File file = new File(filepath);// filepath 是文件地址
    			String filename = file.getName();// 获取日志文件名称
    			InputStream fis = new BufferedInputStream(new FileInputStream(filepath));
    			byte[] buffer = new byte[fis.available()];
    			fis.read(buffer);
    			fis.close();
    			response.reset();
    			// 先去掉文件名称中的空格,然后转换编码格式为utf-8,保证不出现乱码,这个文件名称用于浏览器的下载框中自动显示的文件名
    			response.addHeader("Content-Disposition",
    					"attachment;filename=" + new String(filename.replaceAll(" ", "").getBytes("utf-8"), "iso8859-1"));
    			response.addHeader("Content-Length", "" + file.length());
    			OutputStream os = new BufferedOutputStream(response.getOutputStream());
    			response.setContentType("application/octet-stream");
    			os.write(buffer);// 输出文件
    			os.flush();
    			os.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * 删除单个文件
    	 * 
    	 * @param sPath
    	 *            被删除文件的文件名
    	 * @return 单个文件删除成功返回true,否则返回false
    	 */
    	public static boolean deleteFile(String sPath) {
    		boolean flag = false;
    		File file = new File(sPath);
    		// 路径为文件且不为空则进行删除
    		if (file.isFile() && file.exists()) {
    			file.delete();
    			flag = true;
    		}
    		return flag;
    	}
    }
    

    2. Controller 层操作

    /**
    	 * 下载用户 excel 表接口
    	 * 
    	 * @param response
    	 * @throws IOException
    	 */
    	@RequestMapping("/download")
    	public void download(HttpServletResponse response) throws IOException {
    		// 指定一个地方临时存放生成的 excel 文件,然后后面调用浏览器接口下载完后再删除
    		String FILEPATH = "d:/test.xls";
    		// 判断 "c:/test.xls" 文件是否已经存在,如果存在就删除掉
    		MakeExcel.deleteFile(FILEPATH);
    		// 首行表头信息
    		List<String> ll = new ArrayList<>();
    		ll.add("用户ID");
    		ll.add("姓名");
    		ll.add("电话");
    		// 获取所有用户信息
    		List<User> allUserList = userService.getUserList();
    		// 将用户的相关信息遍历到 List<Map<String, Object>> 中
    		List<Map<String, Object>> list = new ArrayList<>();
    		for (User user : allUserList) {
    			Map<String, Object> map = new HashMap<>();
    
    			map.put("用户ID", user.getId());
    			map.put("姓名", user.getName());
    			map.put("电话", user.getPhone());
    			list.add(map);
    		}
    		try {
    			// 第一个参数:表格中的数据
    			// 第二个参数:表格保存的路径
    			// 第三个参数:表格第二行的列信息
    			// 第四个参数:表格第一行的表头信息
    			// 参照效果图看会清楚些
    			MakeExcel.CreateExcelFile(list, new File(FILEPATH), ll, "用户表");
    		} catch (WriteException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		// 调用浏览器下载接口
    		MakeExcel.send(FILEPATH, response);
    		// 删除临时存放的 excel 文件
    		boolean deleteFileState = MakeExcel.deleteFile(FILEPATH);
    		if (deleteFileState) {
    			System.out.println("服务器上文件删除成功!!!");
    		} else {
    			System.out.println("服务器上文件删除失败!!!");
    		}
    	}

    3. service 层和 dao 层

    根据 controller 层中的提示自己写,主要是对数据库的操作。

    4. JSP 页面

    <form action="download">
        <button type="submit">下载文件</button>
    </form>

    (三)测试

    数据库中的数据表:

    数据库中的数据导入到 excel 表中的效果:

    三、Excel 中的数据导入数据库

     

    (一)原理

    在页面上选中要上传的文件,点击上传按钮。后台接收到上传的 excel 文件,先临时存放到指定的路径,然后再读取临时存放的 excel 文件中数据,读取一条插入一条,或者可以把 excel 中的数据,全部读取出来放到 list 里面,再执行插入数据库操作,等 excel 数据都导入到数据库中后,再把临时存放的 excel 文件给删除掉即可。

    提示:在插入数据前,可以检验当前这条数据是否已经存在数据库中,如果存在可以进行更新数据操作。

    问:为什么要把 excel 文件临时存放起来?

    答:因为浏览器的愿意,无法获取到上传文件的绝对路径。

    (二)源码

    1. Controller 层操作

    /**
    	 * 从 excel 中添加数据到数据库中
    	 * 
    	 * @param filename
    	 * @param request
    	 * @throws IOException
    	 * @throws BiffException
    	 */
    	@RequestMapping(value = "/getexcelfile", produces = "application/json;charset=utf-8")
    	@ResponseBody
    	public String getExcelFile(MultipartFile file, HttpServletRequest request) throws IOException, BiffException {
    		/** 临时存放 excel 文件 **/
    		// 设置相对路径
    		String realPath = request.getSession().getServletContext().getRealPath("/upload");
    		System.out.println(" realPath:" + realPath);
    		// 存放 excel 文件的绝对路径
    		String uploadPath = "";
    		// 获取文件的格式
    		String extention = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
    		// 对格式进行筛选
    		// 仅支持上传 excel 文件,xls 或 xlsx
    		if (extention.equalsIgnoreCase("xls") || extention.equalsIgnoreCase("xlsx")) {
    			File f = new File(realPath);// 在路径下创建文件夹
    			String fileName = file.getOriginalFilename();// 获取上传文件原命名
    			uploadPath = realPath + File.separator + fileName;// 拼接上传路径
    			System.out.println(" uploadPath:" + uploadPath);
    			// 如果指定文件 upload 不存在,则先新建文件夹
    			if (!f.exists()) {
    				f.mkdirs();
    			}
    			file.transferTo(new File(uploadPath));// 文件的传输
    		} else {
    			System.out.println("上传文件格式不对!");
    		}
    
    		/** 读取临时存放的 excel 文件,并将数据导入数据库 **/
    		// 获取 excel 表的文件流
    		File excelFile = new File(uploadPath);
    		Workbook book = Workbook.getWorkbook(excelFile);
    		// 获取 sheet 表
    		// 可以使用下面的写法,"test0" 表示 sheet 表的名字
    		// Sheet rs = book.getSheet("test0");
    		// getSheet(0):表示获取第一张 sheet 表(从左到右数起)
    		Sheet rs = book.getSheet(0);
    		int columns = rs.getColumns();// 得到所有的列
    		int rows = rs.getRows();// 得到所有的行
    		System.out.println(" columns:" + columns + " rows:" + rows);
    		List<User> list = new ArrayList<>();// 临时存放 excel 数据
    		/** 将 excel 数据存放到 List<User> **/
    		// i=2:表示第三行
    		for (int i = 2; i < rows; i++) {
    			User user = new User();
    			// j=0:表示第一列
    			// excel 中默认左边编号也算一列,所以需要从第二列开始获取数据,则下面都使用 j++
    			for (int j = 0; j < columns; j++) {
    				String id = rs.getCell(j++, i).getContents();
    				String name = rs.getCell(j++, i).getContents();
    				String phone = rs.getCell(j++, i).getContents();
    				System.out.println("id=" + id);
    				System.out.println("name=" + name);
    				System.out.println("phone=" + phone);
    				// 将数据 set 进 user 对象中
    				user.setId(Integer.parseInt(id));
    				user.setName(name);
    				user.setPhone(phone);
    				// 将 user 对象添加到 List<User> 里
    				list.add(user);
    			}
    		}
    		/** 将 List<User> 中的数据插入或者更新到数据库 **/
    		User userOne = new User();
    		User tempUser = new User();
    		for (int k = 0; k < list.size(); k++) {
    			userOne = list.get(k);
    			tempUser = userService.selectUserById(userOne.getId());
    			if (tempUser != null) {
    				// 查询返回值 tempUser 不为空,则说明当前这条信息已经存在数据库
    				// 进行数据更新操作即可
    				userService.updataUserByKey(userOne);
    			} else if (tempUser == null) {
    				// tempUser 为空,数据库没有当前信息
    				// 将数据插入即可
    				userService.insertUser(userOne);
    			}
    		}
    
    		/** 删除临时存放的 excel 文件 **/
    		boolean deleteFileState = MakeExcel.deleteFile(realPath + "/test.xls");
    		if (deleteFileState) {
    			System.out.println("服务器上文件删除成功!!!");
    		} else {
    			System.out.println("服务器上文件删除失败!!!");
    		}
    		return " excel 数据更新到数据库成功";
    	}

     

    2. service 层和 dao 层

    根据 controller 层中的提示自己写,主要是对数据的更新和插入操作。

    3. JSP 页面

    <form action="getexcelfile">
        <input type="file" name="filename" enctype="multipart/form-data" method="post">
        <button type="submit">提交</button>
    </form>

    (三)测试

    我上面 excel 数据插入的代码是基于第一部分生成的 excel 格式来写的。所以上传 excel 文件可以使用刚刚下载下来的那一个。然后直接修改或者新增数据即可。如下图所示。

    数据库中表的数据在导入 excel 数据前的前后对比图:左边是导入数据前,右边是导入数据后。

    可以看到,如果数据已经存在,则直接更新数据,如果不存在则插入新的数据。

    四、Demo

    开发工具:Eclipse

    直接 clone 或者下载下来导入即可。

    github:https://github.com/yyzheng1729/excelData

    展开全文
  • 用C#写的从数据库导出Excel类,里面有导出方法。直接用World文档里写的的方法调用类就可以。这个方法是我在项目里使用的方法,很好用。
  • 参考了园子里一些朋友的文章,在下面的处理方式中仍然存在一些问题,更改excel Application的运行帐户为network Service后可以正常下载,但是excel进程无法正常关闭,也试验了很多种方法,仍然没有最后解决。...
         参考了园子里一些朋友的文章,在下面的处理方式中仍然存在一些问题,更改excel Application的运行帐户为network Service后可以正常下载,但是excel进程无法正常关闭,也试验了很多种方法,仍然没有最后解决。
    代码如下:
    string save_path = "", tick = "";
                
    try
                
    {
                    ExcelOperate excelOperate 
    = new ExcelOperate();
                    
    string temp_path = Server.MapPath("xls_files");//生成的文件存放路径

                    
    if (!Directory.Exists(temp_path))
                    
    {
                        Directory.CreateDirectory(temp_path);
                    }


                    
    /**/////获取批次信息
                    using (IDataReader dr = ManageBAO.GetCardBatch(Request.QueryString["BID"]))
                    
    {
                        
    if (dr.Read())
                        
    {
                            BatchName 
    = dr["BatchName"].ToString();
                            Remark 
    = dr["Remark"].ToString();
                            CreateTime 
    = dr["CreateTime"].ToString();
                            AppUser 
    = ManageBAO.GetUserNameByID(dr["UserID"].ToString());
                            CreateUser 
    = ManageBAO.GetUserNameByID(dr["CreateUser"].ToString());
                        }

                    }


                    
    //获取该批次的充值卡列表
                    System.Data.DataTable dt = ManageBAO.GetBatchCard(Request.QueryString["BID"]);

                    
    //建立一个Excel.Application的新进程
                    Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();

                    
    if (app == null)
                    
    {
                        
    return;
                    }

                    app.Visible 
    = false;
                    app.UserControl 
    = true;
                    Workbooks workbooks 
    = app.Workbooks;
                    _Workbook workbook 
    = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
                    Sheets sheets 
    = workbook.Worksheets;
                    _Worksheet worksheet 
    = (_Worksheet)sheets.get_Item(1);
                    
    if (worksheet == null)
                    
    {
                        
    return;
                    }

                    worksheet.get_Range(worksheet.Cells[
    11], worksheet.Cells[15]).Merge(Missing.Value); //横向合并
                    worksheet.get_Range(worksheet.Cells[11], worksheet.Cells[11]).Value2 = BatchName; //标题
                    excelOperate.SetBold(worksheet, worksheet.Cells[11], worksheet.Cells[11]); //黑体
                    excelOperate.SetHAlignCenter(worksheet, worksheet.Cells[11], worksheet.Cells[11]);//居中
                    excelOperate.SetBgColor(worksheet, worksheet.Cells[11], worksheet.Cells[11], System.Drawing.Color.Red);//背景色
                    excelOperate.SetFontSize(worksheet, worksheet.Cells[11], worksheet.Cells[11], 16);//字体大小
                    excelOperate.SetRowHeight(worksheet, worksheet.Cells[11], worksheet.Cells[11], 32.25);//行高
                    worksheet.get_Range(worksheet.Cells[11], worksheet.Cells[11]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);//黑色连续边

                    worksheet.Cells[
    22= "申请人:" + AppUser;
                    worksheet.Cells[
    23= "生成时间:" + CreateTime;
                    worksheet.Cells[
    24= "审核人:" + CreateUser;

                    worksheet.get_Range(worksheet.Cells[
    31], worksheet.Cells[35]).Merge(Missing.Value);
                    worksheet.Cells[
    31= "备注:" + Remark;

                    worksheet.Cells[
    41= "序号";
                    worksheet.Cells[
    42= "卡号";
                    worksheet.Cells[
    43= "密码";
                    worksheet.Cells[
    44= "点数";
                    worksheet.Cells[
    45= "过期时间";
                    excelOperate.SetBold(worksheet, worksheet.Cells[
    41], worksheet.Cells[45]); //黑体
                    worksheet.get_Range(worksheet.Cells[41], worksheet.Cells[45]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);
                    excelOperate.SetHAlignRight(worksheet, worksheet.Cells[
    41], worksheet.Cells[45]);
                    excelOperate.SetBgColor(worksheet, worksheet.Cells[
    41], worksheet.Cells[45], System.Drawing.Color.Silver);//背景色

                    
    //定义一个数组,将数据保存在这个数组中
                    object[,] rawData = new object[dt.Rows.Count, dt.Columns.Count + 1];

                    
    //将数组的第一列计算为序号
                    for (int row = 0; row < dt.Rows.Count; row++)
                    
    {
                        rawData[row, 
    0= row + 1;
                    }


                    
    //将数据写入数组
                    for (int col = 0; col < dt.Columns.Count; col++)
                    
    {
                        
    for (int row = 0; row < dt.Rows.Count; row++)
                        
    {
                            rawData[row, col 
    + 1= dt.Rows[row].ItemArray[col].ToString(); //如不ToString()则时间类型不能被默认读出
                        }

                    }


                    
    //将数据写入sheet
                    worksheet.get_Range(worksheet.Cells[51], worksheet.Cells[dt.Rows.Count + 55]).Value2 = rawData;


                    
    //这种方式验证浪费资源
                    
    //int rowNum = 0;
                    
    //for (int i = 0; i < dv.Count; i++)
                    
    //{
                    
    //    rowNum = i + 1;
                    
    //    worksheet.Cells[5 + i, 1] = rowNum;
                    
    //    worksheet.Cells[5 + i, 2] = dv[i].Row[0].ToString();
                    
    //    worksheet.Cells[5 + i, 3] = dv[i].Row[1].ToString();
                    
    //    worksheet.Cells[5 + i, 4] = dv[i].Row[2].ToString();
                    
    //    worksheet.Cells[5 + i, 5] = dv[i].Row[3].ToString();

                    
    //    excelOperate.SetBold(worksheet, worksheet.Cells[5 + i, 1], worksheet.Cells[5 + i, 1]); //黑体
                    
    //    excelOperate.SetHAlignCenter(worksheet, worksheet.Cells[5 + i, 1], worksheet.Cells[5 + i, 5]);//居中
                    
    //    worksheet.get_Range(worksheet.Cells[5 + i, 1], worksheet.Cells[5 + i, 5]).Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);//设置边框颜色,不然打印预览,会非常不雅观
                    
    //}

                    
    //定义各列宽度
                    excelOperate.SetColumnWidth(worksheet, "A"10);
                    excelOperate.SetColumnWidth(worksheet, 
    "B"20);
                    excelOperate.SetColumnWidth(worksheet, 
    "C"20);
                    excelOperate.SetColumnWidth(worksheet, 
    "D"10);
                    excelOperate.SetColumnWidth(worksheet, 
    "E"20);
                    worksheet.Name 
    = BatchName;
                    tick 
    = DateTime.Now.Ticks.ToString();
                    save_path 
    = temp_path + "\\" + tick + ".xlsx";
                    workbook.SaveAs(save_path, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

                    excelOperate.Dispose(worksheet, workbook, app);
    //最后关闭Excel进程


                    
    //**************直接输出的方式,只能输入xls,不能为xlsx,如数据量超过excel2003的最大行数???******************
                    
    //StringWriter stringWriter = new StringWriter();
                    
    //HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
                    
    //GridView excel = new GridView();
                    
    //excel.DataSource = dt.DefaultView;
                    
    //excel.DataBind();
                    
    //excel.RenderControl(htmlWriter);
                    /**/////这里指定文件的路径
                    //System.IO.StreamWriter sw = new StreamWriter(save_path);
                    
    //sw.Write(stringWriter.ToString());
                    
    //sw.Close();

                    
    //开始压缩
                    String Rar;
                    RegistryKey Reg;
                    Object Obj;
                    String Info;
                    ProcessStartInfo StartInfo;
                    Process Process;
                    
    string pass = Functions.GetRandomPassword(6);

                    Reg 
    = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRAR.exe\Shell\Open\Command");
                    Obj 
    = Reg.GetValue("");
                    Rar 
    = Obj.ToString();
                    Reg.Close();
                    Rar 
    = Rar.Substring(1, Rar.Length - 7);
                    Info 
    = "a -p" + pass + " -r  -ep1 " + tick + ".rar " + @save_path + " 1.rar";//这里为rar的压缩命令格式
                    
    //Info = "a  -r  -ep1 1.rar "+aa+" 1.rar";//这里为rar的压缩命令格式
                    StartInfo = new ProcessStartInfo();
                    StartInfo.FileName 
    = Rar;
                    StartInfo.Arguments 
    = Info;
                    StartInfo.WindowStyle 
    = ProcessWindowStyle.Hidden;
                    StartInfo.WorkingDirectory 
    = temp_path;//获取或设置要启动的进程的初始目录。
                    Process = new Process();
                    Process.StartInfo 
    = StartInfo;
                    Process.Start();
                    Process.WaitForExit();
                    
    if (Process.HasExited)
                    
    {
                        
    //int iExitCode = Process.ExitCode;
                        
    //if (iExitCode == 0)
                        
    //{
                        
    //    Response.Write(iExitCode.ToString() + " 正常完成");
                        
    //}
                        
    //else
                        
    //{
                        
    //    Response.Write(iExitCode.ToString() + " 有错完成");
                        
    //}
                        File.Delete(save_path);
                    }


                    
    //将密码以需要的方式保存
                    Page.Response.Clear();
                    
    bool success = Functions.ResponseFile(tick + ".rar", temp_path + "\\" + tick + ".rar"1000000);
                    
    if (success == true)
                    
    {
                        Response.Write(
    "OK");
                    }

                    
    //Page.Response.End();



                }

                
    catch (Exception ex)
                
    {
                    ILog log 
    = LogManager.GetLogger("Card");
                    log.Debug(ex.Message);
                    Response.Write(ex.Message);
                }

    转载于:https://www.cnblogs.com/TomYu/archive/2008/07/18/1245878.html

    展开全文
  • 从Excel导入数据数据库

    万次阅读 2019-05-27 11:22:56
    在导入数据之前要先设计出一个导入数据Excel模板,写入数据就规定按照此模板写入。 把设计好的模板放入到项目的文件夹中。 接着写一个下载模板的代码,调用浏览器下载窗口,进行下载模板 public ActionResult ...
    开发工具与关键技术:VS2015,ASP.NET MVC
    
    撰写时间:2019年5月24日
    

    通过网页页面把Execl的数据导入到数据库。
    在导入数据之前要先设计出一个导入数据的Excel模板,写入数据就规定按照此模板写入。
    把设计好的模板放入到项目的文件夹中。
    接着写一个下载模板的代码,调用浏览器下载窗口,进行下载模板

     public ActionResult DownImportTemplate()
            {
                //Server  系统
                //MapPath  自动找到这个项目所在路径
                string filePath = Server.MapPath("~/Document/Template/英雄信息导入模板.xls");
                //因为是文件 所以要转换成流.所以要用到IO流
                if (System.IO.File.Exists(filePath))//判断此文件是否存在,并判断是否能用IO流输出
                {
                    //把这个路径转换成文件的名字  Path 路径  GetFileName 获取文件名
                    string strFileName = Path.GetFileName(filePath);
                    //文件返回可以接收三个参数,前面是具体返回的值,中间是返回的类型,最后可以读取文件的长度
                    return File(new FileStream(filePath, FileMode.Open), "application-octet-stream", strFileName);
                        //FileStream 文件流   FileMode 下载文件的模态框   Open,在点击下载模板是自动打开下载浏览器自带的下载框   
                        //application-octet-stream 通过流的格式返回
                        //strFileName 文件名字
                }
                else
                {
                    return Content("模板文件不存在,请联系系统运维人员");
                }
            }
    

    效果图:
    在这里插入图片描述
    接下来就是把模板填好
    把数据导入到数据库。

    public ActionResult EnterHeroData(HttpPostedFileBase file)
            {
                Fantasy fancy = new Fantasy();
                fancy.State = false;
                try
                {
                    //把session中的ImportExcel移除避免残留以前数据
                    Session.Remove("IportExcel");
                    //获取文件的后缀
                    //判断是否是Excel
                    //上传的工作簿的格式必须是 .xls
                    string fileExtension = System.IO.Path.GetExtension(file.FileName);
                    //判断类型是不是  .xls
                    //Equals  等于   判断前后是否相等
                    if (".xls".Equals(fileExtension)||".XLS".Equals(fileExtension))
                    {
                        //声明二进制数组存放文件  数组的长度以文件的长度决定
                        byte[] fileBytes = new byte[file.ContentLength];
                        //将传入的文件转化为二进制的数组存入fileBytes
                        file.InputStream.Read(fileBytes, 0, file.ContentLength);
                        //InputStream IO流读取
                        //将二进制数组转化为内存流
                        System.IO.MemoryStream excelFileStream = new System.IO.MemoryStream(fileBytes);
                        //MemoryStream 内存流
                        //将内存流转化为工作簿
                        NPOI.SS.UserModel.IWorkbook workbook = new HSSFWorkbook(excelFileStream);
    
                        //判断工作簿里是否有工作表
                        //NumberOfSheets > 0 工作表的数量是否大于零
                        //Number 数量   sheets  工作表
                        if (workbook.NumberOfSheets>0)
                        {
                            //查询出 英雄所在阵营ID 英雄技能ID 伤害类型ID 攻击方式ID 英雄点券ID 英雄金币ID
                            List<A01_HeroSame> dbHeroSame = (from tbHeroSame in myModel.A01_HeroSame
                                                             select tbHeroSame).ToList();
                            List<A02_HeroType> dbHeroType = myModel.A02_HeroType.ToList();
                            List<A03_HeroSkill> dbHeroSkill = myModel.A03_HeroSkill.ToList();
                            List<A04_HeroCapability> dbHeroCapability = myModel.A04_HeroCapability.ToList();
                            List<A05_HeroBattle> dbHeroBattle = myModel.A05_HeroBattle.ToList();
                            List<A06_HeroMoney> dbHeroMoney = myModel.A06_HeroMoney.ToList();
                            List<A07_HeroGold> dbHeroGold = myModel.A07_HeroGold.ToList();
                            
    
                            //对象列表
                            List<HeroData> listHero = new List<HeroData>();
                            //获取第一个工作表  下标为零
                            NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0);
                            
    
                            //判断工作表中是否有数据
                            if(sheet.PhysicalNumberOfRows > 0)
                            {
                                //工作表有数据
                                
                                //定义DataTable
                                DataTable dtExcel = new DataTable();
                                //获取标题行---  第二行,索引为1;第一行是说明
                                NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(1);
    
                                //获取表格的列数
                                int cellCount = rowHeader.LastCellNum;//LastCellNum 最后一个单元格是多大就获取列数是多大
                                //获取表格行数
                                int rowCount = sheet.LastRowNum + 1;//因为有个导入说明,所以要加1
    
                                //用到两个for循环,因为行和列
                                //创建dataTable中的列,循环获取表头中各个单元格的值
    
                                //获取列
                                //FirstCellNum 从第一列开始读取
                                for (int i = rowHeader.FirstCellNum; i < cellCount; i++)
                                {
                                    //通过遍历行中的每一个单元格,获取表头中的各个单元格的值
                                    DataColumn dtColumn = new DataColumn(rowHeader.GetCell(i).StringCellValue);
                                    //将获取到的所有标题列数据放到datatable中;
                                    dtExcel.Columns.Add(dtColumn);
                                    //Columns  获取有所有列
                                }
                                //获取行
                                //(sheet.FirstRowNum) + 2 第一行是说明  第二行是表条(标题)第三行才是数据,所以要+2
                                for (int i = (sheet.FirstRowNum)+2; i < rowCount; i++)
                                {
                                    //获取行的数据
                                    NPOI.SS.UserModel.IRow row = sheet.GetRow(i);
                                    DataRow dtRow = dtExcel.NewRow();
                                    if(row != null)
                                    {
                                        //遍历excel中一行的所有单元格
                                        for (int  y = row.FirstCellNum;  y < cellCount; y++)
                                        {
                                            //行中的每一个单元格都不为空
                                            if(row.GetCell(y) != null) {
                                                dtRow[y] = row.GetCell(y).ToString();
                                            }
                                        }
                                    }
                                    //将数据装到DataTable中
                                    //将填入数据的dtRow添入dtExcel
                                    dtExcel.Rows.Add(dtRow);
                                    //Rows 获取所有行
                                }
                                int intSuccess = 0; //记录导入成功的条数
                                int intFail = 0;//记录导入失败的条数 
                                //数据的准确性
                                foreach (DataRow row in dtExcel.Rows)
                                {
                                    //创建studentVo对象保存每一条数据
                                    HeroData Hero = new HeroData();
                                    try
                                    {
                                        //英雄所在阵营 和 获取英雄所在阵营ID
                                        Hero.HeroSame = row["英雄所在阵营"].ToString().Trim();
                                        //通过dataTable中的HeroSame到dbHeroSame中查找相应的HeroSameID
                                        Hero.HeroSameID = dbHeroSame.Where(m => m.HeroSame.Trim() == Hero.HeroSame).SingleOrDefault().HeroSameID;
    
                                        Hero.HeroCapability = row["伤害类型"].ToString().Trim();
                                        Hero.HeroCapabilityID = dbHeroCapability.Where(m => m.HeroCapability.Trim() == Hero.HeroCapability).SingleOrDefault().HeroCapabilityID;
    
                                        Hero.HeroBattle = row["攻击方式"].ToString().Trim();
                                        Hero.HeroBattleID = dbHeroBattle.Where(m => m.HeroBattle.Trim() == Hero.HeroBattle).SingleOrDefault().HeroBattleID;
    
                                        Hero.HeroMoney = row["英雄点券"].ToString().Trim();
                                        var HeroMoney = Convert.ToDecimal(Hero.HeroMoney);
                                        Hero.HeroMoneyID = dbHeroMoney.Where(m => m.HeroMoney == HeroMoney).SingleOrDefault().HeroMoneyID;
    
                                        Hero.HeroGold = row["英雄金币"].ToString().Trim();
                                        var HeroGold = Convert.ToDecimal(Hero.HeroGold);
                                        Hero.HeroGoldID = dbHeroGold.Where(m => m.HeroGold == HeroGold).SingleOrDefault().HeroGoldID;
    
                                        Hero.HeroTitle = row["英雄昵称"].ToString().Trim();
                                        Hero.HeroName = row["英雄名字"].ToString().Trim();
                                        Hero.HeroAddTime = row["英雄加入时间"].ToString().Trim();
                                        var HeroAddTimeLS = Convert.ToDateTime(Hero.HeroAddTime);
                                        Hero.PassiveSkill = row["被动技能"].ToString().Trim();
                                        Hero.SkillQ = row["技能Q"].ToString().Trim();
                                        Hero.SkillW = row["技能W"].ToString().Trim();
                                        Hero.SkillE = row["技能E"].ToString().Trim();
                                        Hero.SkillR = row["技能R"].ToString().Trim();
    
                                        //将每一条数据都添加到对象列表中
                                        listHero.Add(Hero);
                                        intSuccess++;//记录成功的条数
                                    }
                                    catch (Exception)
                                    {
                                        intFail++;
                                        fancy.State = false;
                                        fancy.Text = "数据处理出错";
                                    }
                                }
                                //把数据保存到Session当中
                                Session["ImportExcel"] = listHero;
                                fancy.State = true;
                                fancy.Text = String.Format("文件中共有" + dtExcel.Rows.Count + "条英雄数据,导入成功" + intSuccess + "条,导入失败" + intFail + "条");
                            }
                            else
                            {
                                fancy.Text = "工作表中没有数据";
                            }
    
                        }
                        else
                        {
                            fancy.Text = "工作簿中没有工作表"; 
                        }
                    }
                    else
                    {
                        fancy.Text = "选择的文件类型不正确";
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    fancy.State = false;
                    fancy.Text = "上传失败,类型不对应;请检查是否有工作簿,是否有数据,是否按照模板填写";
                }
                return Json(fancy,JsonRequestBehavior.AllowGet);
            }
    

    以上是控制器这边完整的数据导入代码
    以上的代码只需要根据自己的需要进行更改套用就好

    展开全文
  • List list=mySQLService.getALL() //此处从数据中取数据并封装到Student实体中 2.将查询出来的数据写入EXCEL中 HSSFWorkbook wb=myService.createActExcle(list); 3.设置下载信息并将EXCEL文件写入流中 ...

    1.在Controller中调用Service和dao

    <span style="white-space:pre">			</span>List<Student> list=mySQLService.getALL() //此处从数据中取数据并封装到Student实体中

    2.将查询出来的数据写入EXCEL中

    <span style="white-space:pre">			</span>HSSFWorkbook wb=myService.createActExcle(list);

    3.设置下载信息并将EXCEL文件写入流中

    <span style="white-space:pre">			</span>response.setCharacterEncoding("utf-8");  
    			response.setContentType("application/vnd.ms-excel");  
    			String fileName = "XXXX";  
    			String codedFileName=null;
    			String header=request.getHeader("User-Agent");
    			if(header.contains("Firefox")){//解决火狐乱码
    				 BASE64Encoder base64Encoder=new BASE64Encoder();
    				 codedFileName="=?utf-8?B?"+base64Encoder.encode(fileName.getBytes("utf-8"))+"?=";
    			}else{
    				  codedFileName = URLEncoder.encode(fileName, "UTF-8");
    			}
    			response.setHeader("Content-Disposition", "attachment;fileName=" + codedFileName + ".xls");
    			OutputStream out = response.getOutputStream(); 
    			wb.write(out);  
    			out.close();
    

    4.EXCELL相关信息(MyService类)

    <span style="white-space:pre">		</span>public HSSFWorkbook createActExcle(List<Student> info) {
    		<span style="white-space:pre">	</span>logger.info("打印日志信息!");
    		<span style="white-space:pre">	</span><// 第一步,创建一个webbook,对应一个Excel文件
    		<span style="white-space:pre">	</span>HSSFWorkbook wb = new HSSFWorkbook();
    		<span style="white-space:pre">	</span>// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
    		<span style="white-space:pre">	</span>HSSFSheet sheet = wb.createSheet("学生信息表");
    		<span style="white-space:pre">	</span>// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
    		<span style="white-space:pre">	</span>HSSFRow row = sheet.createRow((int) 0);
    		<span style="white-space:pre">	</span>// 第四步,创建单元格,并设置值表头 设置表头居中
    		<span style="white-space:pre">	</span>HSSFCellStyle style = wb.createCellStyle();
    		<span style="white-space:pre">	</span>style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
    
    		<span style="white-space:pre">	</span>HSSFCell cell = row.createCell((short) 0);
    		<span style="white-space:pre">	</span>cell.setCellValue("学生名称");
    		<span style="white-space:pre">	</span>cell.setCellStyle(style);
    		<span style="white-space:pre">	</span>cell = row.createCell((short) 1);
    		<span style="white-space:pre">	</span>cell.setCellValue("学生年龄");
    		<span style="white-space:pre">	</span>cell.setCellStyle(style);
    		<span style="white-space:pre">	</span>// 第五步,写入实体数据 实际应用中这些数据从数据库得到,
    		<span style="white-space:pre">	</span>if(info!=null&&info.size()>0){
    		<span style="white-space:pre">		</span>for (int i = 0; i < info.size(); i++){
    				<span style="white-space:pre">	</span>row = sheet.createRow((int) i + 1);
    				<span style="white-space:pre">	</span>Student model = info.get(i);
    				<span style="white-space:pre">	</span>// 第四步,创建单元格,并设置值
    				<span style="white-space:pre">	</span>row.createCell((short) 0).setCellValue(model.getStudentName());
    				<span style="white-space:pre">	</span>row.createCell((short) 1).setCellValue(model.getStudenAge());
    			<span style="white-space:pre">	</span>}
    		<span style="white-space:pre">	</span>}
    		<span style="white-space:pre">	</span>logger.info("创建学生信息文件成功!");
    	<span style="white-space:pre">		</span>return wb;
    	<span style="white-space:pre">	</span>}

    展开全文
  • 基于高速公路微波检测器数据(由于保密原因,数据无法提供,请谅解),通过MATLAB调用远程数据库,输入起止日期,集计时间长度,实现某一时间颗粒度内的数据集计与简单计算,并且将数据分日期保存至工作簿各sheet中...
  • 本文利用VFP远程/离线视图提出了针对远程VFP数据库与本地Excel数据相互调用时节省网络负载的一种方法,有效地实现了Excel表格数据通过离线视图输入到远程后台数据库以及远程数据库导出Excel数据表格等功能。
  • 首先介绍一下SQL数据库的一些基本操作: ...放出python调用的代码: 此处是调用dos 操作数据库 不如下面的简单 # -*- coding: utf-8 -*- """ Created on Mon May 6 09:59:32 2019 @author...
  • 微信小程序读取excel数据并批量添加进云数据库 上传excel成功 解析成功 为何云数据库集合中还是没有数据 请个各位大神帮我看看 以下附上图和代码 <p style="text-align:center"><img alt="" height="308" src=...
  • 为了避免反复的手手工后台数据库导出某些数据表到Excel文件、高效率到多份离线数据。 二、功能事项 支持一次性导出多个数据源表、自动获取各表的字段名。 支持控制批次的写入速率。例如:每5000行一个批次写入到...
  • 如何将从数据库中的数据(表的形式显示出来的)导入到Excel表格中?1首先在JSP页面上调用相应的方法: 如: 其中torgRecord为ID 2相应的方法定义如下:public ActionForward toExcel(ActionMapping mapping, ...
  • 网页版excel数据批量导入数据库

    千次阅读 2011-05-31 09:35:00
    同时增加一个定时器(可以用ajax定时器或js定时器+webservice+js)定期从数据库中读取增加的数据条数(需要一定条件比如某个工区新增的)并通过进度条显示。。这样后台运行导入程序,前台页面显示导入
  • 1:在DAL层里获取数据。使用List集合保存起来。比如在DAL层里建立一个InFoService类。并且在GetAllEmail()方法中得到list泛型集合 2:界面上调用InFoService中的GetAllEmail()方法 public void GetEmail(){ ...
  • Posted on 2010-03-31 15:39 Cloud kensin 阅读(132) 评论(0) 编辑 收藏 所属分类: Java 从数据库中读取数据导入到excel中,如果数据量小,的确很简单,直接用POI输出就OK了,可是我这边有>6W的数据要输出,...
  • 从数据库中读取数据导入到excel中,如果数据量小,的确很简单,直接用POI输出就OK了,可是我这边有>6W的数据要输出,java运行了直接溢出了,于是前辈给了个取巧的办法,调用java命令并设置vm参数-Xms1024M -Xmx1024...
  • 在common中写入此函数,在需要的地方调用即可 function exportexcel($data,$title,$filename){ ... *@param $data 一个二维数组,结构如同从数据库查出来的数组  *@param $title excel的第
  • 为方便多个异构的数据源中抽取转换数据、并加载到目标数据库,提出一种...开发的抽取工具软件DbBridge,支持Oracle,SQL server,SAS,Access,Excel数据源抽取数据。软件成功应用于某数据仓库的建立及数据迁移
  • SQL Server 与 Excel 相互调用

    千次阅读 2008-11-16 17:02:00
    SQL Server 与 Excel 相互调用...基本思想是把Excel作为数据库进行处理,通过调用不同数据库来完成数据处理。1.从excel直接读入数据库insert into t_test ( 字段 ) select 字段 FROM OpenDataSource( @#Mic
  • 今天需要导一些数据从excel导入到数据库中。然后调用sql*loader来导入了。粗放一点,其他的日志文件就不指定了。sqlldruserid=n1/n1@xxx...
  • 1.获取项目路径; ActionContext ac = ActionContext.getContext(); ServletContext sc = (ServletContext) ac.get(ServletActionContext....3.调用服务层获取数据(使用list存放): List advises = new ArrayList(); 
  • <div><p>我从excel中读取数据,读取到List集合中的个数是133905, <p>var fsql = new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.SqlServer, conn_string) ....
  • C#调用操作Excel的一个类,下面的这个类中,主要完成的功能是从数据库中逐字段读出数据.
  • 有一个小功能,要求是按照指定时间,计算出规定的工作日,排除国家法定节假日,周日,周六... ...所以,我的思路是,做一个页面,将当年的所有法定假日输入到Excel中,用Excel去导入至数据库,然后从数据库取出数据,去和当前
  • 从数据库里读数据并写入到Excel文件中,C#代码是这样写的。 private void SetContent(HSSFWorkbook hssfworkbook) { ISheet sheet = hssfworkbook.CreateSheet("Sheet1"); hssfworkbook....
  • 由于从数据库中查找出某些数据列可能没必要显示出来,在dataGridView中将对应的列隐藏了,这时导出时就会将隐藏的列导出来,显然不是我们所预期的。做法是先将dataGridView中显示的部分存进DataTable,然后就...
  • 下面的Demo演示的功能是:点击按钮获取保存的位置,并且从数据库中查询用户信息表,然后调用 DataSetToExcel方法,传入保存的位置和一个DataSet对象,就可以在该的位置产生一个Excel文件 //按钮事件,获取保存...
  • Excel.VBA入门到精通

    2019-03-17 15:22:28
    你学习了如何从Excel VBA过程中 控制Access应用软件,执行一些任务,例如打开Access窗体和报告,创建新窗体,运行选择和参数查询,以及调用Access内置 函数。另外,本章示范了一些创建文本文件,查询表,和图表的...
  • asp调用excel专题!

    千次阅读 2004-08-16 15:04:00
     Excel报表模板的制作: 首先根据给定的报表格式,制作一个Excel模板(就是要打印的报表的表格),当然其中需要从数据库中动态统计生成的数据留着空白。这个报表先在Excel中画好,然后保存为模板,存放在起来,...
  • 目录 Excel与Sql Server互通导入导出跨语言 1、目标Excel缺少表的列标题字段 1.1、问题的提出这里开始 1.2、参数的正确写法 1.3、附带说一下Jet 4.0 ... 2.3、Excel文件数据库中Columns字段数据集...
  • 并添加记录、使用ADO在数据库中遍历、修改和删除记录、使用ADO Data和DataGrid控件实现遍历、修改、删除、添加、使用ADO直接操作Access数据库、使用ADO向数据库添加BLOB数据(图像)、使用ADO从数据库中读出BLOB数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 460
精华内容 184
关键字:

excel从数据库调用数据