`
lovexz365
  • 浏览: 108046 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

原样导出html页面表格的方法

    博客分类:
  • java
阅读更多
在开发应用系统的时候,难免遇到导出页面上表格到Excel文件中。该方法适合任何的页面表格导成Excel文件的处理


采用javascript获取表格中的每一个单元格的信息;拼装成一定格式的字符串,提供给后台解析:
下面的代码包含每个单元格产生的Excel中的批注信息,可以根据需要进行取舍。


var hostname = location.hostname; //主机名
/** ******** 导出功能函数 ****** */
/**
 * 浏览器判断
 */
var Sys = {};
var ua = navigator.userAgent.toLowerCase();
if (window.ActiveXObject)
	Sys.ie = ua.match(/msie ([\d.]+)/)[1];
else if (document.getBoxObjectFor)
	Sys.firefox = ua.match(/firefox\/([\d.]+)/)[1];
	
function containsArray(array, obj) {
	for (var i = 0; i < array.length; i++) {
		if (array[i] == obj) {
			return i;
			break;
		}
	}
	return -1;
}
	
Array.prototype.contains = function(obj) {
	return containsArray(this, obj);
}
function PrintTableToExcel(tableId) {
	var offsetLeftArray = new Array();
	var cell;// 单元格Dom
	var col;// 单元格实际所在列
	var cellStr;// 每个cell以row,col,rowSpan,colSpan,value,background形式
	var cellStrArray = [];
	var objTab = document.getElementById(tableId);

	// 遍历第一次取出offsetLeft集合
	for (var i = 0; i < objTab.rows.length; i++) {
		for (var j = 0; j < objTab.rows[i].cells.length; j++) {
			cell = objTab.rows[i].cells[j];
			if (offsetLeftArray.contains(cell.offsetLeft) == -1)
				offsetLeftArray.push(cell.offsetLeft);
		}
	}

	offsetLeftArray.sort(function(x, y) { return parseInt(x) - parseInt(y); });
	//alert("offsetLeft集合:" + offsetLeftArray.join(','));

	// 遍历第二次生成cellStrArray
	for (var i = 0; i < objTab.rows.length; i++) {
		for (var j = 0; j < objTab.rows[i].cells.length; j++) {
			cell = objTab.rows[i].cells[j];
			var project ;//该对象为获得批注信息,可根据需要取舍
			if(cell.id){
				project  = getProjectById(cell.id.split("-")[2]);
				//alert(project.projectCode +"|"+project.projectName +"|"+project.projectManager+"|"+project.projectType+"|"+project.meetingAddress);
			}
			col = offsetLeftArray.contains(cell.offsetLeft);
			if(cell.id){
				cellStr = i + '^' + col + '^' + cell.rowSpan + '^' + cell.colSpan + "^" + (Sys.firefox?cell.textContent:cell.innerText)+"^"+($(cell).css("background")==undefined? '-1':$(cell).css("background"))+"^"+project.projectCode +"^"+project.projectName +"^"+project.managerNames+"^"+(project.projectKind==null? '':project.projectKind) +"^"+project.meetingAddress;
			}else{
				cellStr = i + '^' + col + '^' + cell.rowSpan + '^' + cell.colSpan + "^" + (Sys.firefox?cell.textContent:cell.innerText)+"^"+($(cell).css("background")==undefined? '-1':$(cell).css("background"));
			}
			//alert(cellStr);
			cellStrArray.push(cellStr);
		}
	}
	var str = cellStrArray.join('@');
	var url = 'url' //你要要提交表单的地址
	$("#exportStr").attr("value",str);
	$("#exportfullStr").attr("value",getfullMonthProjectsString);
	document.exportform.action = url;
	document.exportform.method = "post";
	document.exportform.submit();
}

/**
 * @return
 */
function getfullMonthProjectsString(){
	var projects = allProjects.delRepeat();
	var len  = projects.length;
	var fullString  = []
	for (var i=0  ; i <len ; i++){
		if (projects[i].fullMoon == '1'){
			fullString.push(projects[i].projectName +":" +  projects[i].managerNames);
		}
	}
	return fullString.join("@");
}




后台进行接收表单提交内容,解析,然后导出,生成Excel:


public class ExportExcel {

	private List<ExcelContent> parseStrToData(String contentstr) {
		List<ExcelContent> contents = new ArrayList<ExcelContent>();
		String[] contentStrs = contentstr.split("@");
		for (String str : contentStrs) {
			ExcelContent ec = new ExcelContent();
			ExcelComments ecm  = new ExcelComments();
			String[] c = str.split("\\^");
			if (StringUtils.isNotBlank(c[0])) {
				ec.setRowNo(Integer.valueOf(c[0]));
			}
			if (StringUtils.isNotBlank(c[1])) {
				ec.setColNo(Integer.valueOf(c[1]));
			}
			if (StringUtils.isNotBlank(c[2])) {
				ec.setRowSpan(Integer.valueOf(c[2]));
			}
			if (StringUtils.isNotBlank(c[3])) {
				ec.setColSpan(Integer.valueOf(c[3]));
			}
			if (StringUtils.isNotBlank(c[4])) {
				ec.setCellContent(c[4].split("/")[0]);
				//ecm.setProjectName(c[4].split("/")[1]);
			}
			if (StringUtils.isNotBlank(c[5])) {
				ec.setCellBackgroundColor(c[5]);
			}
			if (c.length > 6){
				if(StringUtils.isNotBlank(c[6])){
					ecm.setProjectCode(c[6]);
				}
				if(StringUtils.isNotBlank(c[7])){
					ecm.setProjectName(c[7]);
				}
				if(StringUtils.isNotBlank(c[8])){
					ecm.setProjectManage(c[8]);
				}
				if(StringUtils.isNotBlank(c[9])){
					ecm.setProjectType(c[9]);
				}
				if(StringUtils.isNotBlank(c[10])){
					ecm.setMeettingAddress(c[10]);
				}
				ec.setExcelComments(ecm);
			}
			contents.add(ec);
		}
		return contents;
	}

	public HSSFWorkbook generateExcel(String str,String loginUserName,String fullStr) throws Exception {
		List<ExcelContent> contents = parseStrToData(str);
		HSSFWorkbook workbook = new HSSFWorkbook();
		HSSFSheet sheet = workbook.createSheet();
		HSSFRow row = null;
		HSSFPatriarch drawing  =sheet.createDrawingPatriarch();	//一个Excle共享一个对象
		HSSFClientAnchor anchor = null;
		HSSFComment comment  = null;
		int maxRow=0;
		int count  = 1;
		for (ExcelContent ec : contents) {
			if (contents.size() == count){
				maxRow = ec.getRowNo();
			}
			count++;
			row = sheet.getRow(ec.getRowNo());
			if (row == null) {
				row = sheet.createRow(ec.getRowNo());
			}
			if (StringUtils.isNotBlank(ec.getCellContent())) {
				HSSFCell cell = row.createCell(ec.getColNo());
			
				CellRangeAddress cellRangeAddress = new CellRangeAddress(ec
						.getRowNo(), ec.getRowNo() + ec.getRowSpan() - 1, ec
						.getColNo(), ec.getColNo() + ec.getColSpan() - 1);
				sheet.addMergedRegion(cellRangeAddress);
				cell.setCellValue(new HSSFRichTextString(ec.getCellContent()));
			
				StringBuffer  cmContent  = new StringBuffer(100);
				if (ec.getExcelComments()!=null){
					CreationHelper factory = workbook.getCreationHelper();
					anchor =  new HSSFClientAnchor(0, 1, 0, 1,(short) cell.getColumnIndex(), row.getRowNum(), (short) (cell.getColumnIndex()+6) , row.getRowNum()+6);
					comment = drawing.createComment(anchor);
					cmContent.append("xxxxx: "+ec.getExcelComments().getProjectCode() +"\n");
					cmContent.append("xxxxxxxx:").append(ec.getExcelComments().getProjectName()).append("\n");
					cmContent.append("xxxx:").append(ec.getExcelComments().getProjectManage()).append("\n");
					cmContent.append("xx:").append(ec.getExcelComments().getProjectType()).append("\n");
					cmContent.append("xxxx:").append(ec.getExcelComments().getMeettingAddress()).append("\n");
					RichTextString string = factory.createRichTextString(cmContent.toString());
					comment.setString(string);
					comment.setAuthor("NETWOKER SERVICE");
					cell.setCellComment(comment);
				}
				//comment.set
				HSSFCellStyle style = sheet.getWorkbook().createCellStyle();
				style.setAlignment(CellStyle.VERTICAL_CENTER);
				style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
				style.setBottomBorderColor(HSSFColor.BLACK.index);
				if (StringUtils.isNotBlank(ec.getCellBackgroundColor())) {
					String color = ec.getCellBackgroundColor().toUpperCase();
					if (!("-1".equals(color))) {
						short shortColor = ColorConstant.COLOR_EXCEL.get(color);
						style.setFillForegroundColor(shortColor);
						style.setFillPattern(CellStyle.SOLID_FOREGROUND);
					}
				}
				cell.setCellStyle(style);
			}
		}
		addFullMonthProject(sheet, maxRow,fullStr);
		return workbook;
	}
	
	public void addFullMonthProject(HSSFSheet sheet,int maxRow,String fullStr){
		HSSFRow row  = sheet.createRow(maxRow+1);
		HSSFCell cell = row.createCell(0);
		cell.setCellValue(new HSSFRichTextString("xxxxx: "));
		List<FullMonthProject> list  = parseFullMonthProjectStr(fullStr);
		int len  = list.size();
		for (int i=0 ; i<len ; i++){
			row =  sheet.createRow(maxRow+1 +(i+1));
			HSSFCell cell0 = row.createCell(0);
			cell  = row.createCell(1);
			CellRangeAddress cellRangeAddress = new CellRangeAddress(row.getRowNum(), row.getRowNum(), cell.getColumnIndex(), cell.getColumnIndex()+8);
			sheet.addMergedRegion(cellRangeAddress);
			HSSFCell cell2  = row.createCell(cell.getColumnIndex()+9);
			String pname  = list.get(i).getProName();
			String pusers = list.get(i).getProUsers();
			cell0.setCellValue(i+1);
			cell.setCellValue(new HSSFRichTextString(pname));
			cell2.setCellValue(new HSSFRichTextString(pusers));
		}
	}
	public List<FullMonthProject> parseFullMonthProjectStr(String fullStr){
		List<FullMonthProject> fullMonthProjects  = new ArrayList<FullMonthProject>();
		if(StringUtils.isNotBlank(fullStr)){
			String []  full  = fullStr.split("@");
			for (String s :full){
				FullMonthProject fp  = new FullMonthProject();
				fp.setProName(s.split(":")[0]);
				fp.setProUsers(s.split(":")[1]);
				fullMonthProjects.add(fp);
			}
		}
		return fullMonthProjects;
	}
	class FullMonthProject{
		private String proName;
		private String proUsers;
		public String getProName() {
			return proName;
		}
		public void setProName(String proName) {
			this.proName = proName;
		}
		public String getProUsers() {
			return proUsers;
		}
		public void setProUsers(String proUsers) {
			this.proUsers = proUsers;
		}
	}
}



注意:如果你的界面的table具有单元格的背景色,请采用poi提供的color颜色,做好html中的color 和POI提供color的对应关系,这个关系我是这样处理的:
public class ColorConstant{

	/**
	 * 系统中项目的颜色和POI中颜色对应关系的工具类
	 * 方便Excle的导出,单元格的着色
	 */
	public static final Map<String,Short> COLOR_EXCEL = new HashMap<String,Short>();
	
	static {
		COLOR_EXCEL.put("#FFFF00", Short.valueOf(IndexedColors.YELLOW.getIndex()));
		COLOR_EXCEL.put("#FF00FF", Short.valueOf(IndexedColors.PINK.getIndex()));
		COLOR_EXCEL.put("#FF0000", Short.valueOf(IndexedColors.RED.getIndex()));
		COLOR_EXCEL.put("#0000FF", Short.valueOf(IndexedColors.BLUE.getIndex()));
		COLOR_EXCEL.put("#00FF00", Short.valueOf(IndexedColors.GREEN.getIndex()));
		COLOR_EXCEL.put("#FFD700", Short.valueOf(IndexedColors.GOLD.getIndex()));
		COLOR_EXCEL.put("#EE82EE", Short.valueOf(IndexedColors.VIOLET.getIndex()));
		COLOR_EXCEL.put("#008080", Short.valueOf(IndexedColors.TEAL.getIndex()));
		COLOR_EXCEL.put("#eeeeee", Short.valueOf(IndexedColors.BROWN.getIndex()));
		COLOR_EXCEL.put("#fff",Short.valueOf(IndexedColors.WHITE.getIndex()));
	}
	
}



分享到:
评论

相关推荐

    【ASP.NET编程知识】浅析Repeater控件的使用 (原样导出和动态显示隐藏Repeater中的列).docx

    9. **数据导出到Excel**:结合前面提到的导出方法,可以将Repeater中的数据导出到Excel文件,供用户下载。 Repeater控件的灵活性和可扩展性使其在ASP.NET开发中成为强大的工具,能够根据具体需求定制复杂的数据展示...

    Vue2.0实现将页面中表格数据导出excel的实例

    本篇文章主要介绍了Vue2.0实现将页面中表格数据导出excel的实例,包括安装依赖、新建文件夹、编写export2Excel方法、按钮导出调用export2Excel方法、formatJson方法和解决webpack报解析错误等内容。hope对大家的学习...

    NET Core通过预设的html模板,导出Word文件,Html文件,Pdf文件

    使用C# NET Core技术,通过预设的html模板,导出Word文件,Html文件,Pdf,使用说明参考https://blog.csdn.net/qq_27337291/article/details/120676751?spm=1001.2014.3001.5501

    c#dataGridView数据导出excel表格文件,并打开文件

    把dataGridView显示的数据原样导出excel表格,并打开文件。有两个参数,参数1为要导的dataGridView名,参数2为导出文件绝对径。

    HTML表格生成Excel文件代码.zip

    HTML表格生成Excel文件是网页开发中常见的需求,尤其在数据展示和数据分析的场景下。这个压缩包"HTML表格生成Excel文件代码.zip"提供了一个解决方案,它利用了jQuery库的一个插件——jquery.table2excel,实现了从...

    TinyMCE富文本编辑器导出为word文档(JS实现)

    TinyMCE富文本编辑器是一款广泛应用的开源JavaScript编辑器,它提供了丰富的文本格式化功能,让用户可以在网页上创建和编辑类似Word的文档。本示例着重讲解如何利用JavaScript技术将TinyMCE编辑器中的内容导出为Word...

    pb导出漂亮美观excel

    标题中的"pb导出漂亮美观excel"指的是在PowerBuilder(PB)环境中,通过特定方法将数据导出为格式精美、视觉效果良好的Excel电子表格。在实际业务应用中,经常需要将数据库中的数据导出到Excel,以便进行数据分析、...

    pb导出excel表技巧

    SaveAs方法是PB中最常用的导出Excel表的方法。使用SaveAs方法,我们可以将数据窗口的数据导出到Excel表中。下面是一个简单的示例代码: ```powerbuilder if dw_1.SaveAs(docname, HTMLTable!, True) = -1 then ...

    数据窗口导出成 excel

    在这个场景中,“数据窗口导出成excel”指的是将数据窗口中的数据转换并保存为Microsoft Excel电子表格格式,以便于数据分析、报告制作或共享。 导出数据窗口到Excel时,需要考虑的关键知识点包括: 1. **数据窗口...

    Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法

    今天使用vue调试页面,发现了页面上的一个问题,后台数据传过来的HTML字符串并没有被转换为正常的HTML代码,一拍脑门,发现忘记转换了,于是满心欢喜加上了{{{}}}。但是之后构建发现报错: 为此去官网上查了下资料,...

    浅析Repeater控件的使用 (原样导出和动态显示/隐藏Repeater中的列)

    本篇文章主要探讨了如何使用Repeater控件进行原样导出数据以及如何动态地显示或隐藏Repeater中的列。 一、Repeater数据原样导出 Repeater控件在页面上呈现数据时,允许开发者完全控制HTML输出。要原样导出Repeater...

    Java报表工具FineReport导出EXCEL的四种API

    本文将详细介绍FineReport导出Excel的四种API,包括原样导出、分页导出、分页分sheet导出和大数据量导出。 首先,原样导出是最基本的导出方式,它不需要进行数据预览,直接将报表数据导出为Excel文件。这种方式适用...

    html原样粘贴(excel格式可原样粘贴)

    html源码,打开后页面中有个全屏边框,里面可以粘贴任何你复制的东西,如果是网页内容,则自动粘贴网页的源码,粘贴后的内容可编辑,以达到可视化制作html代码。有兴趣的人可以自己玩一下 博文地址:...

    POI实现Excel导入导出并附带加载进度条

    本项目通过Apache POI实现了Excel的导入与导出功能,并在操作过程中加入了进度条展示,增强了用户体验。 首先,Apache POI的核心类HSSFWorkbook和XSSFWorkbook分别用于处理老版本的.xls和新版本的.xlsx文件。在导入...

    datawindow导出excel组件dw2xls

    在标题提到的“datawindow导出excel组件dw2xls”,这是一个专门针对PB DataWindow的工具,用于将 DataWindow 中的数据原样导出到 Excel 文件中。 “dw2xls”组件解决了在不安装 Microsoft Excel 的情况下,快速高效...

    PDF文件转word原样版转TXT网页html图像flash

    在描述中提到的“原样版转”,意味着PDFTigerch在转换过程中注重保留原始PDF的样式、图片、表格和排版等元素,以确保转换后的Word文档与原始PDF尽可能一致。 转换PDF到Word的过程中,用户可能遇到的问题包括文字...

Global site tag (gtag.js) - Google Analytics