精华内容
下载资源
问答
  • 在web开发中,有一个经典的功能,就是数据的导入导出。特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的... 呵呵,首先我们来导出EXCEL格式的文件吧。现在主流的操作Ex...

            在web开发中,有一个经典的功能,就是数据的导入导出。特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作。而数据导出的格式一般是EXCEL或者PDF,我这里就用两篇文章分别给大家介绍下。(注意,我们这里说的数据导出可不是数据库中的数据导出!么误会啦^_^)

             呵呵,首先我们来导出EXCEL格式的文件吧。现在主流的操作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI。这里我们用Apache POI!我们先去Apache的大本营下载POI的jar包:http://poi.apache.org/ ,我这里使用的是3.0.2版本。

            将3个jar包导入到classpath下,什么?忘了怎么导包?不会吧!好,我们来写一个导出Excel的实用类(所谓实用,是指基本不用怎么修改就可以在实际项目中直接使用的!)。我一直强调做类也好,做方法也好,一定要通用性和灵活性强。下面这个类就算基本贯彻了我的这种思想。那么,熟悉许老师风格的人应该知道,这时候该要甩出一长串代码了。没错,大伙请看:

    public class Student {
    	private long id;
    	private String name;
    	private int age;
    	private boolean sex;
    	private Date birthday;
    	// Constructor, Getter and Setter...
    }
    public class Book {
    	private int bookId;
    	private String name;
    	private String author;
    	private float price;
    	private String isbn;
    	private String pubName;
    	private byte[] preface;
    	// Constructor, Getter and Setter...
    }

    上面这两个类一目了然,就是两个简单的javabean风格的类。再看下面真正的重点类:

    public class ExportExcel<T> {
    	public void exportExcel(Collection<T> dataset, OutputStream out) {
    		exportExcel("测试POI导出EXCEL文档", null, dataset, out, "yyyy-MM-dd");
    	}
    
    	public void exportExcel(String[] headers, Collection<T> dataset,
    			OutputStream out) {
    		exportExcel("测试POI导出EXCEL文档", headers, dataset, out, "yyyy-MM-dd");
    	}
    
    	public void exportExcel(String[] headers, Collection<T> dataset,
    			OutputStream out, String pattern) {
    		exportExcel("测试POI导出EXCEL文档", headers, dataset, out, pattern);
    	}
    
    	/**
    	 * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
    	 *
    	 * @param title
    	 *            表格标题名
    	 * @param headers
    	 *            表格属性列名数组
    	 * @param dataset
    	 *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
    	 *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
    	 * @param out
    	 *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
    	 * @param pattern
    	 *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
    	 */
    	@SuppressWarnings("unchecked")
    	public void exportExcel(String title, String[] headers,
    			Collection<T> dataset, OutputStream out, String pattern) {
    		// 声明一个工作薄
    		HSSFWorkbook workbook = new HSSFWorkbook();
    		// 生成一个表格
    		HSSFSheet sheet = workbook.createSheet(title);
    		// 设置表格默认列宽度为15个字节
    		sheet.setDefaultColumnWidth((short) 15);
    		// 生成一个样式
    		HSSFCellStyle style = workbook.createCellStyle();
    		// 设置这些样式
    		style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
    		style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
    		style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
    		style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
    		style.setBorderRight(HSSFCellStyle.BORDER_THIN);
    		style.setBorderTop(HSSFCellStyle.BORDER_THIN);
    		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    		// 生成一个字体
    		HSSFFont font = workbook.createFont();
    		font.setColor(HSSFColor.VIOLET.index);
    		font.setFontHeightInPoints((short) 12);
    		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    		// 把字体应用到当前的样式
    		style.setFont(font);
    		// 生成并设置另一个样式
    		HSSFCellStyle style2 = workbook.createCellStyle();
    		style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
    		style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
    		style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
    		style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
    		style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
    		style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
    		style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    		style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
    		// 生成另一个字体
    		HSSFFont font2 = workbook.createFont();
    		font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
    		// 把字体应用到当前的样式
    		style2.setFont(font2);
    		// 声明一个画图的顶级管理器
    		HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
    		// 定义注释的大小和位置,详见文档
    		HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(
    				0, 0, 0, 0, (short) 4, 2, (short) 6, 5));
    		// 设置注释内容
    		comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
    		// 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
    		comment.setAuthor("leno");
    		// 产生表格标题行
    		HSSFRow row = sheet.createRow(0);
    		for (short i = 0; i < headers.length; i++) {
    			HSSFCell cell = row.createCell(i);
    			cell.setCellStyle(style);
    			HSSFRichTextString text = new HSSFRichTextString(headers[i]);
    			cell.setCellValue(text);
    		}
    		// 遍历集合数据,产生数据行
    		Iterator<T> it = dataset.iterator();
    		int index = 0;
    		while (it.hasNext()) {
    			index++;
    			row = sheet.createRow(index);
    			T t = (T) it.next();
    			// 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
    			Field[] fields = t.getClass().getDeclaredFields();
    			for (short i = 0; i < fields.length; i++) {
    				HSSFCell cell = row.createCell(i);
    				cell.setCellStyle(style2);
    				Field field = fields[i];
    				String fieldName = field.getName();
    				String getMethodName = "get"
    						+ fieldName.substring(0, 1).toUpperCase()
    						+ fieldName.substring(1);
    				try {
    					Class tCls = t.getClass();
    					Method getMethod = tCls.getMethod(getMethodName,
    							new Class[] {});
    					Object value = getMethod.invoke(t, new Object[] {});
    					// 判断值的类型后进行强制类型转换
    					String textValue = null;
    					// if (value instanceof Integer) {
    					// int intValue = (Integer) value;
    					// cell.setCellValue(intValue);
    					// } else if (value instanceof Float) {
    					// float fValue = (Float) value;
    					// textValue = new HSSFRichTextString(
    					// String.valueOf(fValue));
    					// cell.setCellValue(textValue);
    					// } else if (value instanceof Double) {
    					// double dValue = (Double) value;
    					// textValue = new HSSFRichTextString(
    					// String.valueOf(dValue));
    					// cell.setCellValue(textValue);
    					// } else if (value instanceof Long) {
    					// long longValue = (Long) value;
    					// cell.setCellValue(longValue);
    					// }
    					if (value instanceof Boolean) {
    						boolean bValue = (Boolean) value;
    						textValue = "男";
    						if (!bValue) {
    							textValue = "女";
    						}
    					} else if (value instanceof Date) {
    						Date date = (Date) value;
    						SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    						textValue = sdf.format(date);
    					} else if (value instanceof byte[]) {
    						// 有图片时,设置行高为60px;
    						row.setHeightInPoints(60);
    						// 设置图片所在列宽度为80px,注意这里单位的一个换算
    						sheet.setColumnWidth(i, (short) (35.7 * 80));
    						// sheet.autoSizeColumn(i);
    						byte[] bsValue = (byte[]) value;
    						HSSFClientAnchor anchor = new HSSFClientAnchor(0,
    								0, 1023, 255, (short) 6, index, (short) 6,
    								index);
    						anchor.setAnchorType(2);
    						patriarch.createPicture(anchor, workbook
    								.addPicture(bsValue,
    										HSSFWorkbook.PICTURE_TYPE_JPEG));
    					} else {
    						// 其它数据类型都当作字符串简单处理
    						textValue = value.toString();
    					}
    					// 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
    					if (textValue != null) {
    						Pattern p = Pattern.compile("^//d+(//.//d+)?$");
    						Matcher matcher = p.matcher(textValue);
    						if (matcher.matches()) {
    							// 是数字当作double处理
    							cell.setCellValue(Double.parseDouble(textValue));
    						} else {
    							HSSFRichTextString richString = new HSSFRichTextString(
    									textValue);
    							HSSFFont font3 = workbook.createFont();
    							font3.setColor(HSSFColor.BLUE.index);
    							richString.applyFont(font3);
    							cell.setCellValue(richString);
    						}
    					}
    				} catch (SecurityException e) {
    					e.printStackTrace();
    				} catch (NoSuchMethodException e) {
    					e.printStackTrace();
    				} catch (IllegalArgumentException e) {
    					e.printStackTrace();
    				} catch (IllegalAccessException e) {
    					e.printStackTrace();
    				} catch (InvocationTargetException e) {
    					e.printStackTrace();
    				} finally {
    					// 清理资源
    				}
    			}
    		}
    		try {
    			workbook.write(out);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	public static void main(String[] args) {
    		// 测试学生
    		ExportExcel<Student> ex = new ExportExcel<Student>();
    		String[] headers = { "学号", "姓名", "年龄", "性别", "出生日期" };
    		List<Student> dataset = new ArrayList<Student>();
    		dataset.add(new Student(10000001, "张三", 20, true, new Date()));
    		dataset.add(new Student(20000002, "李四", 24, false, new Date()));
    		dataset.add(new Student(30000003, "王五", 22, true, new Date()));
    		// 测试图书
    		ExportExcel<Book> ex2 = new ExportExcel<Book>();
    		String[] headers2 = { "图书编号", "图书名称", "图书作者", "图书价格", "图书ISBN",
    				"图书出版社", "封面图片" };
    		List<Book> dataset2 = new ArrayList<Book>();
    		try {
    			BufferedInputStream bis = new BufferedInputStream(
    					new FileInputStream("V://book.bmp"));
    			byte[] buf = new byte[bis.available()];
    			while ((bis.read(buf)) != -1) {
    				//
    			}
    			dataset2.add(new Book(1, "jsp", "leno", 300.33f, "1234567",
    					"清华出版社", buf));
    			dataset2.add(new Book(2, "java编程思想", "brucl", 300.33f,
    					"1234567", "阳光出版社", buf));
    			dataset2.add(new Book(3, "DOM艺术", "lenotang", 300.33f,
    					"1234567", "清华出版社", buf));
    			dataset2.add(new Book(4, "c++经典", "leno", 400.33f, "1234567",
    					"清华出版社", buf));
    			dataset2.add(new Book(5, "c#入门", "leno", 300.33f, "1234567",
    					"汤春秀出版社", buf));
    			OutputStream out = new FileOutputStream("E://a.xls");
    			OutputStream out2 = new FileOutputStream("E://b.xls");
    			ex.exportExcel(headers, dataset, out);
    			ex2.exportExcel(headers2, dataset2, out2);
    			out.close();
    			out2.close();
    			JOptionPane.showMessageDialog(null, "导出成功!");
    			System.out.println("excel导出成功!");
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }

            写完之后,如果您不是用eclipse工具生成的Servlet,千万别忘了在web.xml上注册这个Servelt。而且同样的,拷贝一张小巧的图书图片命名为book.jpg放置到当前WEB根目录的/WEB-INF/下。部署好web工程,用浏览器访问Servlet看下效果吧!是不是下载成功了。呵呵,您可以将下载到本地的excel报表用打印机打印出来,这样您就大功告成了。完事了我们就思考:我们发现,我们做的方法,不管是本地调用,还是在WEB服务器端用Servlet调用;不管是输出学生列表,还是图书列表信息,代码都几乎一样,而且这些数据我们很容器结合后台的DAO操作数据库动态获取。恩,类和方法的通用性和灵活性开始有点感觉了。好啦,祝您学习愉快!

    Java导出Excel弹出下载框

            将ExportExcel类的main方法改成public void test(),OutputStream out = new FileOutputStream("E://a.xls");这边可以对应Servlet适当改下路径,Servlet代码如下:

    public class ExcelServlet extends HttpServlet {
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		(new ExportExcel()).test();
    		String str = "a.xls";
    		//String path = request.getSession().getServletContext().getRealPath(str);
    		download("E://a.xls", response);
    	}
    	private void download(String path, HttpServletResponse response) {
    		try {
    			// path是指欲下载的文件的路径。
    			File file = new File(path);
    			// 取得文件名。
    			String filename = file.getName();
    			// 以流的形式下载文件。
    			InputStream fis = new BufferedInputStream(new FileInputStream(path));
    			byte[] buffer = new byte[fis.available()];
    			fis.read(buffer);
    			fis.close();
    			// 清空response
    			response.reset();
    			// 设置response的Header
    			response.addHeader("Content-Disposition", "attachment;filename="
    					+ new String(filename.getBytes()));
    			response.addHeader("Content-Length", "" + file.length());
    			OutputStream toClient = new BufferedOutputStream(
    					response.getOutputStream());
    			response.setContentType("application/vnd.ms-excel;charset=gb2312");
    			toClient.write(buffer);
    			toClient.flush();
    			toClient.close();
    		} catch (IOException ex) {
    			ex.printStackTrace();
    		}
    	}
    }

    补充:

    于2014-08-28补充

    今天(20140828)用博文中的代码重新调试了下,献上Java POI 导入导出Excel简单小例子一枚,方便你我。

    源代码下载地址:http://download.csdn.net/detail/evangel_z/7834173

    注:

    1)源代码是不含jar包的,jar包可以去本文补充部分下边的链接中下载,本地测试例子中所使用的所有jar包如下:

    2)直接使用该例子源代码的话,需要在E盘下放置一张名为book的png格式图片(book.png),用于导出含有图片的excel文件(b.xls)。当然,您可以根据实际需要更换代码中的图片路径;

    3)使用本文源代码正常启动服务器后,web页面导出Excel文档具体路径:http://localhost:8080/poi/export

    4)例子代码比较简单,仅供参考……

     

    于2014-12-02补充

    前段时间,在之前代码的基础上,抽空改了改代码,具体如下:

    1)去除图片和Excel文件未找到的bug;

    2)增加代码需要的jar包;

    3)完整代码已放在github上……

    最新代码下载地址:https://github.com/T5750/poi

     

    于2015-01-13补充

    由于不少热心网友问读取Excel模版导出相关问题,故今晚在之前代码的基础上,临时加了些代码,具体如下:

    1)新增使用POI读取Excel模版的例子,模版为poi/WebContent/docs/replaceTemplate.xls;

    2)在poi/src/replace/TestExcelReplace类中,请根据实际情况,调整读取和保存Excel的路径后,直接运行即可;

    最新代码下载地址不变,先到这里,抽空再优化……

     

    于2015-01-24补充

    前段时间,在之前代码的基础上,增加了种读取Excel模版导出的方式。今天,抽空改了改说明,具体如下:

    1)在poi/src/replace包中,新增上次补充里POI读取Excel模版的ReplaceExcelServlet.java,供web页面使用;

    2)在poi/src/template包中,增加了种读取Excel模版导出的方式,其对应的模版为poi/WebContent/docs/template.xls。请根据实际情况,调整读取和保存Excel的路径后,直接运行TestTemplate.java即可。TemplateServlet.java则对应web页面使用;

    最新代码下载地址不变……

     

    于2015-01-31补充

    昨晚,在之前代码的基础上,加上本文中可直接运行导出Excel的代码。具体如下:

    1)在poi/src/testExport包中,TestExportExcel.java,链接地址:https://github.com/T5750/poi/blob/master/src/testExport/TestExportExcel.java

    最新代码下载地址不变……

     

    于2015-02-10补充

    在之前代码的基础上,加上可以通过POI导出Excel2007的例子。具体如下:

    1)在poi/src/testExport包中,TestExportExcel2007.java,链接地址:https://github.com/T5750/poi/blob/master/src/testExport/TestExportExcel2007.java

     

    于2015-02-12补充

    今天,在之前代码的基础上,抽空改了改代码。具体如下:

    1)在poi/src/testExport包中,新增Excel2007Servlet.java。以及,修改相关配置;

    2)在poi/src/testExport包中,对导出Excel文件进行重命名,便于查看;

    3)更新该poi例子对应的帮助文档。

     

    于2019-07-23补充

    Servlet -> Spring Boot

    相关文章&官方文档&源代码下载地址:

    Java POI读取Office Excel (2003,2007)及相关jar包 Spring Boot

    最新官方文档:https://poi.apache.org/apidocs/index.html

    源代码下载地址:http://download.csdn.net/detail/evangel_z/7834173
    最新代码下载地址:https://github.com/T5750/poi

    展开全文
  • js 实现纯前端将数据导出excel两种方式,亲测有效

    万次阅读 多人点赞 2018-05-23 14:33:27
    由于项目需要,需要在不调用后台接口的情况下,将json数据导出excel表格,参考了好多资料以及很多大佬写的博客终于实现,兼容chrome没问题,其他还没有测试过,这边介绍两种实现方式,并附上代码和gif动图,博主...

    方法一

    将table标签,包括tr、td等对json数据进行拼接,将table输出到表格上实现,这种方法的弊端在于输出的是伪excel,虽说生成xls为后缀的文件,但文件形式上还是html,代码如下

    <html>
    <head>
        <p style="font-size: 20px;color: red;">使用table标签方式将json导出xls文件</p>
        <button onclick='tableToExcel()'>导出</button>
    </head>
    <body>
        <script>  
        const tableToExcel = () => {
            // 要导出的json数据
            const jsonData = [
                {
                    name:'路人甲',
                    phone:'123456',
                    email:'123@123456.com'
                },
                {
                    name:'炮灰乙',
                    phone:'123456',
                    email:'123@123456.com'
                },
                {
                    name:'土匪丙',
                    phone:'123456',
                    email:'123@123456.com'
                },
                {
            
    展开全文
  • C# 导出EXCELC# 导出EXCELC# 导出EXCELC# 导出EXCELC# 导出EXCELC# 导出EXCELC# 导出EXCELC# 导出EXCEL
  • C#导出ExcelC#导出ExcelC#导出ExcelC#导出ExcelC#导出ExcelC#导出ExcelC#导出ExcelC#导出ExcelC#导出Excel
  • jsp导出Excel;简单实用!导出Excel;导出Word jsp导出Excel;简单实用!导出Excel;导出Word jsp导出Excel;简单实用!导出Excel;导出Word
  • **转载自 小茗同学 的 如何使用JavaScript实现纯前端读取和导出excel文件 js-xlsx 介绍由SheetJS出品的js-xlsx是一款非常方便的只需要纯JS即可读取和导出excel的工具库,功能强大,支持格式众多,支持xls、...

    **转载自 小茗同学如何使用JavaScript实现纯前端读取和导出excel文件

    js-xlsx 介绍

    SheetJS出品的js-xlsx是一款非常方便的只需要纯JS即可读取和导出excel的工具库,功能强大,支持格式众多,支持xlsxlsxods(一种OpenOffice专有表格文件格式)等十几种格式。本文全部都是以xlsx格式为例。

    官方github:https://github.com/SheetJS/js-xlsx
    本文配套demo在线演示地址:http://demo.haoji.me/2017/02/08-js-xlsx/

    1.1. 兼容性

    兼容性如下图:

    1.2. 如何使用

    dist目录下有很多个JS文件,一般情况下用xlsx.core.min.js就够了,xlsx.full.min.js则是包含了所有功能模块。

    直接script标签引入即可:

    <script type="text/javascript" src="./js/xlsx.core.min.js"></script>
    <script type="text/javascript" src="./js/xlsx.core.min.js"></script>
    复制运行

    读取excel

    读取excel主要是通过XLSX.read(data, {type: type});方法来实现,返回一个叫WorkBook的对象,type主要取值如下:

    • base64: 以base64方式读取;
    • binary: BinaryString格式(byte n is data.charCodeAt(n))
    • string: UTF8编码的字符串;
    • buffer: nodejs Buffer;
    • array: Uint8Array,8位无符号数组;
    • file: 文件的路径(仅nodejs下支持);

    2.1. 获取workbook对象

    2.1.1. 读取本地文件

    直接上代码:

    // 读取本地excel文件
    function readWorkbookFromLocalFile(file, callback) {
    	var reader = new FileReader();
    	reader.onload = function(e) {
    		var data = e.target.result;
    		var workbook = XLSX.read(data, {type: 'binary'});
    		if(callback) callback(workbook);
    	};
    	reader.readAsBinaryString(file);
    }
    // 读取本地excel文件
    function readWorkbookFromLocalFile(file, callback) {
    	var reader = new FileReader();
    	reader.onload = function(e) {
    		var data = e.target.result;
    		var workbook = XLSX.read(data, {type: 'binary'});
    		if(callback) callback(workbook);
    	};
    	reader.readAsBinaryString(file);
    }
    复制运行

    2.1.2. 读取网络文件

    // 从网络上读取某个excel文件,url必须同域,否则报错
    function readWorkbookFromRemoteFile(url, callback) {
    	var xhr = new XMLHttpRequest();
    	xhr.open('get', url, true);
    	xhr.responseType = 'arraybuffer';
    	xhr.onload = function(e) {
    		if(xhr.status == 200) {
    			var data = new Uint8Array(xhr.response)
    			var workbook = XLSX.read(data, {type: 'array'});
    			if(callback) callback(workbook);
    		}
    	};
    	xhr.send();
    }
    // 从网络上读取某个excel文件,url必须同域,否则报错
    function readWorkbookFromRemoteFile(url, callback) {
    	var xhr = new XMLHttpRequest();
    	xhr.open('get', url, true);
    	xhr.responseType = 'arraybuffer';
    	xhr.onload = function(e) {
    		if(xhr.status == 200) {
    			var data = new Uint8Array(xhr.response)
    			var workbook = XLSX.read(data, {type: 'array'});
    			if(callback) callback(workbook);
    		}
    	};
    	xhr.send();
    }
    复制运行

    2.2. 详解 workbook

    2.2.1. Workbook Object

    workbook里面有什么东西呢,我们打印出来看一下:

    可以看到,SheetNames里面保存了所有的sheet名字,然后Sheets则保存了每个sheet的具体内容(我们称之为Sheet Object)。每一个sheet是通过类似A1这样的键值保存每个单元格的内容,我们称之为单元格对象(Cell Object):

    2.2.2. Sheet Object

    每一个Sheet Object表示一张表格,只要不是!开头的都表示普通cell,否则,表示一些特殊含义,具体如下:

    • sheet['!ref']:表示所有单元格的范围,例如从A1到F8则记录为A1:F8
    • sheet[!merges]:存放一些单元格合并信息,是一个数组,每个数组由包含se构成的对象组成,s表示开始,e表示结束,r表示行,c表示列;
    • 等等;

    关于单元格合并,看懂下面这张图基本上就没问题了:

    结果如下:

    2.2.3. 单元格对象

    每一个单元格是一个对象(Cell Object),主要有tvrhw等字段(详见这里):

    • t:表示内容类型,s表示string类型,n表示number类型,b表示boolean类型,d表示date类型,等等
    • v:表示原始值;
    • f:表示公式,如B2+B3
    • h:HTML内容
    • w:格式化后的内容
    • r:富文本内容rich text
    • 等等

    2.2.4. 读取workbook

    普通方法:

    // 读取 excel文件
    function outputWorkbook(workbook) {
    	var sheetNames = workbook.SheetNames; // 工作表名称集合
    	sheetNames.forEach(name => {
    		var worksheet = workbook.Sheets[name]; // 只能通过工作表名称来获取指定工作表
    		for(var key in worksheet) {
    			// v是读取单元格的原始值
    			console.log(key, key[0] === '!' ? worksheet[key] : worksheet[key].v);
    		}
    	});
    }
    // 读取 excel文件
    function outputWorkbook(workbook) {
    	var sheetNames = workbook.SheetNames; // 工作表名称集合
    	sheetNames.forEach(name => {
    		var worksheet = workbook.Sheets[name]; // 只能通过工作表名称来获取指定工作表
    		for(var key in worksheet) {
    			// v是读取单元格的原始值
    			console.log(key, key[0] === '!' ? worksheet[key] : worksheet[key].v);
    		}
    	});
    }
    复制运行

    根据!ref确定excel的范围,再根据!merges确定单元格合并(如果有),最后输出整个table,比较麻烦,幸运的是,插件自身已经写好工具类XLSX.utils给我们直接使用,无需我们自己遍历,工具类输出主要包括如下:

    有些不常用,常用的主要是:

    • XLSX.utils.sheet_to_csv:生成CSV格式
    • XLSX.utils.sheet_to_txt:生成纯文本格式
    • XLSX.utils.sheet_to_html:生成HTML格式
    • XLSX.utils.sheet_to_json:输出JSON格式

    常用的主要是sheet_to_csv或者sheet_to_html,转csv的话会忽略格式、单元格合并等信息,所以复杂表格可能不适用。转html的话会保留单元格合并,但是生成的是<html></html>代码,而不是<table></table>,需要对表格进行一些定制时不太方便,所以具体还是要视情况来采用合适的工具类。

    这里写一个采用转csv方式输出结果的简单示例,可点击这里查看在线DEMO

    function readWorkbook(workbook)
    {
    	var sheetNames = workbook.SheetNames; // 工作表名称集合
    	var worksheet = workbook.Sheets[sheetNames[0]]; // 这里我们只读取第一张sheet
    	var csv = XLSX.utils.sheet_to_csv(worksheet);
    	document.getElementById('result').innerHTML = csv2table(csv);
    }
    

    // 将csv转换成简单的表格,会忽略单元格合并,在第一行和第一列追加类似excel的索引
    function csv2table(csv)
    {
    var html = ‘<table>’;
    var rows = csv.split(’\n’);
    rows.pop(); // 最后一行没用的
    rows.forEach(function(row, idx) {
    var columns = row.split(’,’);
    columns.unshift(idx+1); // 添加行索引
    if(idx 0) { // 添加列索引
    html += ‘<tr>’;
    for(var i=0; i<columns.length; i++) {
    html += ‘<th>’ + (i0?’’:String.fromCharCode(65+i-1)) + ‘</th>’;
    }
    html += ‘</tr>’;
    }
    html += ‘<tr>’;
    columns.forEach(function(column) {
    html += ‘<td>’+column+’</td>’;
    });
    html += ‘</tr>’;
    });
    html += ‘</table>’;
    return html;
    }
    function readWorkbook(workbook)
    {
    var sheetNames = workbook.SheetNames; // 工作表名称集合
    var worksheet = workbook.Sheets[sheetNames[0]]; // 这里我们只读取第一张sheet
    var csv = XLSX.utils.sheet_to_csv(worksheet);
    document.getElementById(‘result’).innerHTML = csv2table(csv);
    }

    // 将csv转换成简单的表格,会忽略单元格合并,在第一行和第一列追加类似excel的索引
    function csv2table(csv)
    {
    var html = ‘<table>’;
    var rows = csv.split(’\n’);
    rows.pop(); // 最后一行没用的
    rows.forEach(function(row, idx) {
    var columns = row.split(’,’);
    columns.unshift(idx+1); // 添加行索引
    if(idx == 0) { // 添加列索引
    html += ‘<tr>’;
    for(var i=0; i<columns.length; i++) {
    html += ‘<th>’ + (i==0?’’:String.fromCharCode(65+i-1)) + ‘</th>’;
    }
    html += ‘</tr>’;
    }
    html += ‘<tr>’;
    columns.forEach(function(column) {
    html += ‘<td>’+column+’</td>’;
    });
    html += ‘</tr>’;
    });
    html += ‘</table>’;
    return html;
    }
    复制运行

    导出excel

    导出分为2种,一种是基于现有excel修改,一种是全新生成,前者比较简单,我们这里着重讲后者。

    3.1. 自己手写代码生成

    导出excel文件,主要是如何生成一个sheet,我们这里写一个最简单的csv转excel示例:

    // csv转sheet对象
    function csv2sheet(csv) {
    	var sheet = {}; // 将要生成的sheet
    	csv = csv.split('\n');
    	csv.forEach(function(row, i) {
    		row = row.split(',');
    		if(i == 0) sheet['!ref'] = 'A1:'+String.fromCharCode(65+row.length-1)+(csv.length-1);
    		row.forEach(function(col, j) {
    			sheet[String.fromCharCode(65+j)+(i+1)] = {v: col};
    		});
    	});
    	return sheet;
    }
    

    // 将一个sheet转成最终的excel文件的blob对象,然后利用URL.createObjectURL下载
    function sheet2blob(sheet, sheetName) {
    sheetName = sheetName || ‘sheet1’;
    var workbook = {
    SheetNames: [sheetName],
    Sheets: {}
    };
    workbook.Sheets[sheetName] = sheet;
    // 生成excel的配置项
    var wopts = {
    bookType: ‘xlsx’, // 要生成的文件类型
    bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
    type: ‘binary’
    };
    var wbout = XLSX.write(workbook, wopts);
    var blob = new Blob([s2ab(wbout)], {type:“application/octet-stream”});
    // 字符串转ArrayBuffer
    function s2ab(s) {
    var buf = new ArrayBuffer(s.length);
    var view = new Uint8Array(buf);
    for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
    return buf;
    }
    return blob;
    }
    // csv转sheet对象
    function csv2sheet(csv) {
    var sheet = {}; // 将要生成的sheet
    csv = csv.split(’\n’);
    csv.forEach(function(row, i) {
    row = row.split(’,’);
    if(i == 0) sheet[’!ref’] = ‘A1:’+String.fromCharCode(65+row.length-1)+(csv.length-1);
    row.forEach(function(col, j) {
    sheet[String.fromCharCode(65+j)+(i+1)] = {v: col};
    });
    });
    return sheet;
    }

    // 将一个sheet转成最终的excel文件的blob对象,然后利用URL.createObjectURL下载
    function sheet2blob(sheet, sheetName) {
    sheetName = sheetName || ‘sheet1’;
    var workbook = {
    SheetNames: [sheetName],
    Sheets: {}
    };
    workbook.Sheets[sheetName] = sheet;
    // 生成excel的配置项
    var wopts = {
    bookType: ‘xlsx’, // 要生成的文件类型
    bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
    type: ‘binary’
    };
    var wbout = XLSX.write(workbook, wopts);
    var blob = new Blob([s2ab(wbout)], {type:“application/octet-stream”});
    // 字符串转ArrayBuffer
    function s2ab(s) {
    var buf = new ArrayBuffer(s.length);
    var view = new Uint8Array(buf);
    for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
    return buf;
    }
    return blob;
    }
    复制运行

    拿到上面的blob对象就可以直接下载了,参考我之前在JS弹出下载对话框里面封装好的openDownloadDialog方法:

    /**
     * 通用的打开下载对话框方法,没有测试过具体兼容性
     * @param url 下载地址,也可以是一个blob对象,必选
     * @param saveName 保存文件名,可选
     */
    function openDownloadDialog(url, saveName)
    {
    	if(typeof url == 'object' && url instanceof Blob)
    	{
    		url = URL.createObjectURL(url); // 创建blob地址
    	}
    	var aLink = document.createElement('a');
    	aLink.href = url;
    	aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
    	var event;
    	if(window.MouseEvent) event = new MouseEvent('click');
    	else
    	{
    		event = document.createEvent('MouseEvents');
    		event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    	}
    	aLink.dispatchEvent(event);
    }
    /**
     * 通用的打开下载对话框方法,没有测试过具体兼容性
     * @param url 下载地址,也可以是一个blob对象,必选
     * @param saveName 保存文件名,可选
     */
    function openDownloadDialog(url, saveName)
    {
    	if(typeof url == 'object' && url instanceof Blob)
    	{
    		url = URL.createObjectURL(url); // 创建blob地址
    	}
    	var aLink = document.createElement('a');
    	aLink.href = url;
    	aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
    	var event;
    	if(window.MouseEvent) event = new MouseEvent('click');
    	else
    	{
    		event = document.createEvent('MouseEvents');
    		event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    	}
    	aLink.dispatchEvent(event);
    }
    复制运行

    所以,最终下载实现如下:

    // 传入csv,执行后就会弹出下载框
    function exportExcel(csv) {
    	var sheet = csv2sheet(csv);
    	var blob = sheet2blob(sheet);
    	openDownloadDialog(blob, '导出.xlsx')}
    // 传入csv,执行后就会弹出下载框
    function exportExcel(csv) {
    	var sheet = csv2sheet(csv);
    	var blob = sheet2blob(sheet);
    	openDownloadDialog(blob, '导出.xlsx');
    }
    复制运行

    3.2. 利用官方工具类生成

    其实上面这些代码都不需要我们手写,官方已经提供好了现成的工具类给我们使用,主要包括:

    • aoa_to_sheet: 这个工具类最强大也最实用了,将一个二维数组转成sheet,会自动处理number、string、boolean、date等类型数据;
    • table_to_sheet: 将一个table dom直接转成sheet,会自动识别colspanrowspan并将其转成对应的单元格合并;
    • json_to_sheet: 将一个由对象组成的数组转成sheet;

    aoa_to_sheet示例:

    var aoa = [
    	['姓名', '性别', '年龄', '注册时间'],
    	['张三', '男', 18, new Date()],
    	['李四', '女', 22, new Date()]
    ];
    var sheet = XLSX.utils.aoa_to_sheet(aoa);
    openDownloadDialog(sheet2blob(sheet), '导出.xlsx');
    var aoa = [
    	['姓名', '性别', '年龄', '注册时间'],
    	['张三', '男', 18, new Date()],
    	['李四', '女', 22, new Date()]
    ];
    var sheet = XLSX.utils.aoa_to_sheet(aoa);
    openDownloadDialog(sheet2blob(sheet), '导出.xlsx');
    复制运行

    table_to_sheet就更简单了,直接XLSX.utils.table_to_sheet($('table')[0])即可;

    3.3. 处理单元格合并

    一般来说,前端生成excel而不是csv最主要目的都是为了解决csv不能实现单元格合并的问题,要不然直接导出csv文件就好了,何必引入几百kb的插件。

    假设我们要生成如下格式的excel文件,其中A1-C1进行单元格合并:

    代码如下:

    var aoa = [
    	['主要信息', null, null, '其它信息'], // 特别注意合并的地方后面预留2个null
    	['姓名', '性别', '年龄', '注册时间'],
    	['张三', '男', 18, new Date()],
    	['李四', '女', 22, new Date()]
    ];
    var sheet = XLSX.utils.aoa_to_sheet(aoa);
    sheet['!merges'] = [
    	// 设置A1-C1的单元格合并
    	{s: {r: 0, c: 0}, e: {r: 0, c: 2}}
    ];
    openDownloadDialog(sheet2blob(sheet), '单元格合并示例.xlsx');
    var aoa = [
    	['主要信息', null, null, '其它信息'], // 特别注意合并的地方后面预留2个null
    	['姓名', '性别', '年龄', '注册时间'],
    	['张三', '男', 18, new Date()],
    	['李四', '女', 22, new Date()]
    ];
    var sheet = XLSX.utils.aoa_to_sheet(aoa);
    sheet['!merges'] = [
    	// 设置A1-C1的单元格合并
    	{s: {r: 0, c: 0}, e: {r: 0, c: 2}}
    ];
    openDownloadDialog(sheet2blob(sheet), '单元格合并示例.xlsx');
    复制运行

    需要注意的地方就是被合并的单元格要用null预留出位置,否则后面的内容(本例中是第四列其它信息)会被覆盖。

    3.4. 自定义样式

    普通版本不支持定义字体、颜色、背景色等,有这个功能需要的可以使用pro版,好像是要收费的,因为官网没看到下载地址。

    展开全文
  • laravel导出excel

    2018-05-30 15:18:55
    laravel导出excel,laravel导出excellaravel导出excellaravel导出excel
  • Excel导入导出 Excel导入 Excel导出
  • poi导出excel demo

    2017-10-21 11:40:29
    poi导出excel demo,poi导出excel demo,poi导出excel demo,poi导出excel demo,poi导出excel demo,
  • Java POI 导入导出Excel简单实例源代码

    千次下载 热门讨论 2014-08-28 16:25:39
    Java POI 导入导出Excel简单实例源代码 该源代码的jar包,参见以下博文附录截图 Java POI导出EXCEL经典实现 Java导出Excel弹出下载框 http://blog.csdn.net/evangel_z/article/details/7332535 web页面导出Excel...
  • NPOI导出excel

    热门讨论 2013-01-11 22:36:57
    NPOI导出excel, 支持DATATABLE导出excel,同时支持datagridview导出excel
  • winform 导出 Excel

    千次阅读 热门讨论 2019-03-01 14:51:16
    本篇博客将介绍「winform 导出 Excel」或「~~VS2017 导出 Excel~~ 」又或「C# 导出 Excel」又或「.Net 导出 Excel」的常用的两种方式以及简单分享其他方式(能力原因,已经尽力,用词还是可能不当)。

    本篇博客将介绍「winform 导出 Excel」或「VS2017 导出 Excel 」又或「C# 导出 Excel」又或「.Net 导出 Excel」的常用的两种方式以及简单分享其他方式(能力原因,已经尽力,用词还是可能不当)。

    将数据通过 DataGridView 展示出来之后,用户可能会用 Excel 来存储资料,故还需要将 DataGridView 中显示的必要数据导出。

    利用 Microsoft.Office.Interop.Excel

    具体步骤请参考:VS2017 导出Excel

    注意事项:

    在上述博客中,提到 添加好引用之后需要做的就是写代码,但是有一点… 别忘记引用命名空间
    但是我在微软的官方资料中并没有发现说要「引用命名空间」,参考 Office 如何使用 Excel 对象将 DataGridView 数据导出到 Excel 示例

    如果确实需要导入命名空间的话,那就引用下吧,毕竟就是个 Alt + Enter 的功夫或者 Shift + Alt + F10 的功夫。

    利用 NPOI

    在 NuGet 中可能搜不到 NPOI ,可以按照以下步骤解决:
    按 工具->NuGet 包管理器->程序包管理控制台 顺序依次点击,在 VS2017 界面的弹出的 程序包管理控制台输入 Install-Package NPOI -Version 2.4.1
    具体参考:NuGet Gallery

    NPOI 常用方法:

    • 工作本HSSFWorkbook
      构造方法,无参表示创建一个新的工作本,可以接收一个流用于打开一个现有的工作本
      方法CreateSheet(索引):创建指定索引的sheet对象
      方法GetSheetAt(索引):根据索引获取sheet对象
      方法CreateCellStyle():创建单元格样式对象
      方法CreateFont():创建字体对象
      方法Write(stream):将工作本输出到流中
    • 工作表HSSFSheet
      方法CreateRow(索引):创建指定索引的行
      方法GetRow(索引):根据索引获取行
      方法AddMergedRegion():设置合并区域,参数包括开始行索引、开始列索引、结束行索引、结束列索引
      方法SetColumnWidth(索引,宽度):设置指定列的宽度,单位是一个字符宽度的256分之1(说明:一个汉字占用两个字符)
      属性FirstRowNum、LastRowNum:获取第一行、最后一行的索引值
    • 行HSSFRow
      方法CreateCell(索引):创建指定索引的行
      方法GetCell(索引):根据索引获取单元格
      属性HeightInPoints:指定或设置高度
    • 单元格HSSFCell
      方法SetCellValue():设置单元格中的值
      属性***CellValue:获取单元格中指定类型的值,如果类型不匹配则抛异常
      属性CellStyle:获取或设置单元格样式
    • 单元格样式HSSFCellStyle
      方法SetFont(字体对象):设置字体样式
      属性Alignment:水平对齐,1左,2中,3右
    • 字体对象HSSFFont
      属性FontHeightInPoints:获取或设置字体大小
      属性Boldweight:获取或设置字体加粗

    代码示例:

    sing Entity;
    using Facade;
    using NPOI.HSSF.UserModel;
    using NPOI.SS.UserModel;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
            private void btnExportExcel_Click(object sender, EventArgs e)
            {
                
                var list = cciFacade.GetList(dic);
                HSSFWorkbook workbook = new HSSFWorkbook();
                ISheet sheet = workbook.CreateSheet("退卡记录");
                
                IRow rowTitle = sheet.CreateRow(0);
                ICell cellTitle0 = rowTitle.CreateCell(0);
                cellTitle0.SetCellValue("编号");
    
                ICell cellTitle1 = rowTitle.CreateCell(1);
                cellTitle1.SetCellValue("卡号");
    
                ICell cellTitle2 = rowTitle.CreateCell(2);
                cellTitle2.SetCellValue("类型");
    
                ICell cellTitle3 = rowTitle.CreateCell(3);
                cellTitle3.SetCellValue("退卡金额");
    
                ICell cellTitle4 = rowTitle.CreateCell(4);
                cellTitle4.SetCellValue("退卡时间");
    
                ICell cellTitle5 = rowTitle.CreateCell(5);
                cellTitle5.SetCellValue("操作用户");
                
                int rowIndex = 1;
                foreach (var ri in list)
                {
                    IRow rowData = sheet.CreateRow(rowIndex++);
                    ICell cellData0 = rowData.CreateCell(0);
                    cellData0.SetCellValue(ri.Serial);
    
                    ICell cellData1 = rowData.CreateCell(1);
                    cellData1.SetCellValue(ri.SId);
    
                    ICell cellData2 = rowData.CreateCell(2);
                    cellData2.SetCellValue(ri.SType);
    
                    ICell cellData3 = rowData.CreateCell(3);
                    cellData3.SetCellValue(Convert.ToDouble(ri.CancelCash));
    
                    ICell cellData4 = rowData.CreateCell(4);
                    cellData4.SetCellValue(ri.CancelTime.ToString());
    
                    ICell cellData5 = rowData.CreateCell(5);
                    cellData5.SetCellValue(ri.Uname);
                }
                FileStream stream = new FileStream(@"..\..\..\ExportExcel\退卡金额.xls", FileMode.Create);
                workbook.Write(stream);
                stream.Close();
                stream.Dispose();
            }
    

    推荐阅读

    Office 如何使用 Excel 对象将 DataGridView 数据导出到 Excel 示例

    Server 端存取 Excel 檔案的利器:NPOI Library

    机房重构之导出Excel表

    在 VS2008 下操作 Excel 的方法总结

    [.net]程序处理Excel的技术

    NPOI教程

    展开全文
  • oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel
  • --操作excel --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.1</version> <scope&g
  • C# 使用 C# Aspose.Cells导出多个Sheet的Excel .net导出Excel C#导出Excel
  • jxls导出excel官方例子

    2018-07-17 11:34:04
    jxls导出excel官方例子jxls导出excel官方例子jxls导出excel官方例子jxls导出excel官方例子
  • js导出EXCEL js导出EXCEL

    万次阅读 2012-09-19 15:03:38
    参考一:... 参考二: js导出EXCEL js导出EXCEL //导出excel function exportExcel(DivID){ //先声明Excel插件、Excel工作簿等对像 var jXls, myWorkbook, myWorksheet;
  • Excel通用导出excel文件

    热门讨论 2013-02-25 17:29:43
    Excel 通用导出 excel 文件
  • php导出excel文件

    2017-04-11 15:55:23
    php导出excel文件
  • VC 导出excel

    热门讨论 2009-07-13 16:37:03
    VC 导出excel VC 导出excel VC 导出excel
  • 使用C#利用Aspose.Cells.dll导出Excel. 优化了之前上传的导出Excel方法,希望能够对大家有帮助 大家也可以根据自己需求修改导出Excel方法
  • java导入导出excel

    2018-03-29 13:56:07
    java 导入exce 导出excel 这里面分别一个几个方式的导入导出集合
  • powerdesigner导出excel脚本
  • java导出excel

    2015-03-24 21:28:37
    java代码导出excel表格,常用于解决页面前台展示为table,实现该table的导出,详细可以参照博客介绍。
  • layui导出excel的js文件

    2019-11-15 23:14:30
    layui导出excel的js文件layui导出excel的js文件layui导出excel的js文件layui导出excel的js文件layui导出excel的js文件layui导出excel的js文件
  • 基于注解导出excel

    2017-08-03 11:44:34
    基于注解,java反射,通用导出excel工具,demo
  • easyui导出excel

    热门讨论 2012-10-31 10:50:32
    Jquery_easyui_datagrid_js导出excel
  • Easypoi模版导出excel

    万次阅读 热门讨论 2017-10-20 09:54:07
    若您正在使用easypoi进行excel导出的话,希望这篇文章能帮到您。 该文章是使用easypoi得模版方式实现excel导出(目前是单sheet的导出), 若需要使用非模版形式导出多sheet得话,可以...模版形式导出Excel(多Shee...
  • C#_WinForm_导出Excel

    2017-02-20 10:02:23
    C#的WinForm项目导出Excel功能。将DataTable导出Excel。将dataGridView导出Excel。若界面上不需要dataGridView,可以将其隐藏掉,也能导出Excel。本例只是抛砖引玉,共同学习一同进步,谢谢。
  • C# 导出excel代码

    2011-05-20 07:46:15
    C# 导出excel代码C# 导出excel代码C# 导出excel代码C# 导出excel代码C# 导出excel代码C# 导出excel代码C# 导出excel代码C# 导出excel代码C# 导出excel代码C# 导出excel代码C# 导出excel代码C# 导出excel代码C# 导出...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 158,029
精华内容 63,211
关键字:

导出excel