Excel区域复制粘贴
这段工作做的是利用JAVA实现Excel的一块区域的复制并粘贴。
就本身对于 Excel跟 鼠标来说,这也是一个非常简单的操作。
但是 用 java的poi来做,还是 有点儿吃力的。
下面是之前做的一个demo。
为了跑动 poi,需要在 pom.xml里面
加入 这个 依赖
<!-- XSSFWorkbook poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
调用
package com.example.demo.controller; import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Set;
import java.util.TreeSet; import javax.servlet.http.HttpServletResponse; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelOutputController { public void outputExcel(HttpServletResponse response) throws IOException {
InputStream excelFile = new FileInputStream("c:/test.xlsx"); Workbook wbsrc = new XSSFWorkbook(excelFile); Sheet oldSheet = wbsrc.getSheetAt(0); Sheet newSheet = wbsrc.getSheetAt(1); int startRow = 0,endRow = 11; int startCol = 0,endCol = 11; int newCellRow = 3,newCellCol =3; copyArea(oldSheet,startRow,endRow,startCol,endCol,newSheet,newCellRow,newCellCol); OutputStream out = null; out = response.getOutputStream(); response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=fff.xlsx"); wbsrc.write(out);
wbsrc.close(); } private void copyArea(Sheet oldSheet, int startRow, int endRow, int startCol, int endCol, Sheet newSheet,
int newCellRow, int newCellCol) { Row oldRow = null;
Row newRow = null; Cell oldCell = null;
Cell newCell = null; List<CellRangeAddress> mergedRegions = oldSheet.getMergedRegions(); Set<String> newMergedRegions = new TreeSet<>(); for(int i = startRow;i<=endRow;i++) {
oldRow = oldSheet.getRow(i);
newRow = newSheet.getRow(newCellRow+i); if(newRow==null) {
newRow = newSheet.createRow(newCellRow+i);
}
for(int j= startCol;j<=endCol;j++) {
oldCell = oldRow.getCell(j);
boolean isNew = false;
CellRangeAddress mergedRegion = judgeMergedRegion(mergedRegions,oldCell);
if(mergedRegion !=null) {
CellRangeAddress newMergedRegion = new CellRangeAddress(mergedRegion.getFirstRow()+newCellRow,
mergedRegion.getLastRow()+newCellRow,mergedRegion.getFirstColumn()+newCellCol,mergedRegion.getLastColumn()+newCellCol);
if(judgeRegionExisted(newMergedRegion,newMergedRegions)) {
isNew = false; } else {
newMergedRegions.add(newMergedRegion.formatAsString());
newSheet.addMergedRegion(newMergedRegion);
isNew =true;
}
} else { //not a mergedRegion
isNew = true;
}
newCell = newRow.getCell(newCellCol+j);
if(newCell == null) {
newCell = newRow.createCell(newCellCol+j);
}
newCell.setCellStyle(oldCell.getCellStyle());
if(isNew) {
switch(oldCell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC:
newCell.setCellValue(oldCell.getNumericCellValue());
break;
case Cell.CELL_TYPE_STRING:
newCell.setCellValue(oldCell.getStringCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
newCell.setCellFormula(oldCell.getCellFormula());
break;
case Cell.CELL_TYPE_BLANK:
newCell.setCellType(Cell.CELL_TYPE_BLANK);
break;
case Cell.CELL_TYPE_BOOLEAN:
newCell.setCellValue(oldCell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_ERROR:
newCell.setCellValue(oldCell.getErrorCellValue());
break;
default:
break; }
}
}
}
} private boolean judgeRegionExisted(CellRangeAddress newMergedRegion, Set<String> newMergedRegions) {
return newMergedRegions.contains(newMergedRegion.formatAsString());
} private CellRangeAddress judgeMergedRegion(List<CellRangeAddress> mergedRegions, Cell cell) { for(CellRangeAddress cra:mergedRegions){
if(cra.isInRange(cell))
return cra;
}
return null;
} }
等哪天我能跑交互以后,做一个 跑动的样例出来。
Excel区域复制粘贴的更多相关文章
- 个人永久性免费-Excel催化剂功能第44波-可见区域复制粘贴不覆盖隐藏内容
Excel的复制粘贴操作,每天都在进行,若其中稍能提升一点效率,长久来说,实在是很可观的效率提升. Excel自带的复制粘贴功能,若复制的数据源或粘贴的目标位置中有隐藏的行列内容,简单一个复制粘贴充满 ...
- Excel 如何复制粘贴一整行
在某些时候,我们需要重复性的录入一些信息,而且表头都是一样的,一直拉列宽是相当令人烦躁的事情. 所以,就想可以直接复制黏贴出一整行,包括行的各个列宽. 具体操作如图: ——>首先,一整行复制, ...
- 个人永久性免费-Excel催化剂功能第82波-复制粘贴按源区域大小自动扩展收缩目标区域
日常工作中,复制粘贴的操作,永远是最高频的操作,没有之一,在最高频的操作上,进行优化,让过程更智能,比一天到晚鼓吹人工智能替换人的骇人听闻的新闻来得更实际.此篇带来一点点的小小的改进,让日后无数的复制 ...
- WPF的DataGrid控件从excel里复制数据然后粘贴
WPF的DataGrid控件不能像winform的DataGridView控件一样,支持值的粘贴.WPF的DataGrid控件本质上是跟数据绑定联系在一起,所以需要进行复制粘贴的操作,可以在wpf里用 ...
- C# 从excel里面复制的1万6千多条记录粘贴到FCKeditor里面,点保存的时候,保存不了,页面没有反应
客户那边添加公告,是直接从excel里面复制的,有1万6千多条记录,excel文件有6M多. 编辑器用的FCKeditor,也能粘贴上,就是点保存的时候,执行了一段时间就没有反映了,保存不了. 想着可 ...
- excel中的数据粘贴不全到plsql中,excel 粘贴后空白,Excel复制粘贴内容不全
http://zhidao.baidu.com/link?url=pHZQvfWJzI-lQjl4uP86q4GLcpYHu4o-fdjiYegJS0Cy5HEq5oz0YrUye3iHjmv5CJ3 ...
- 按键精灵如何批量复制文本,再往excel里面一次性粘贴?
原帖地址 http://zhidao.baidu.com/link?url=M2A9E1JF7wAzjtxMQG9uiW_PvP39HVlfwn6zDMzk9m6U05JA37SrgDcrVXg_c9 ...
- Excel 2010 如何将筛选后的数据复制粘贴到另一个工作表筛选后的表格里
如果你是指自动筛选后,把筛选数据复制/粘贴到另外一个工作表中,不妨试试试 第一步选中筛选后的数据区域:第二步执行菜单命令“编辑/定位/定位条件/可见单元格”,确定:第三步单击复制按钮或者Ctrl+C或 ...
- 解决:EXCEL复制粘贴,精度丢失
公司一部分数据是存在elasticsearch里面的,但里面的ID设计得特别长,我是打算把ID号考出来,用jmeter批量 删除的,但复制粘贴到excel里,ID就会精度丢失. 后来找到一个办法,解决 ...
随机推荐
- Transposed Convolution 反卷积
Transposed convolutions也称作fractionally strided convolutions(本人比较喜欢这个称呼,比较直观),Upconvolution,deconvolu ...
- zencart前台小语种后台英文 导入批量表 前后台不显示产品的问题
admin\includes\init_includes\init_languages.php 前台小语种后台英文导致批量表导入后,前后台不显示产品的问题将红色部分修改成前台语言对应的值,前台语言对应 ...
- (极值点偏移问题的几种方案)已知$\dfrac{\ln x_1}{x_1}=\dfrac{\ln x_2}{x_2}$,求证:$x_1+x_2>2\text{e}$.
第一个图适合在手机上操作(点击\(\checkmark\)显示/隐藏) 第二个图适合在电脑上操作(点击\(\checkmark\)显示/隐藏)
- ESP8266网络介绍
仔细分析上图,根据功能区分,可以分为: Arduino功能,把ESP8266 当做 Arduino来使用 SD —— SD卡库 Servo —— 伺服电机库 Wire —— I2C库 SPI —— s ...
- vue-项目模块化中this 指向问题
在VUE项目中,我们想把一些主要的代码抽到一个模块中 export default { /** * 获取本地的群列表数据 * @param {*} params */ getGroupList () ...
- StyleBundle打包问题—— /* 未能缩小。正在返回未缩小的内容。
问题--查看打包发布的结果,类似下面的这样的 /* 未能缩小.正在返回未缩小的内容. (1567,65): run-time error CSS1054: JavaScript error in ex ...
- Vue-Router的简单使用
Vue-Router的最简单使用 1.先注册路由 2.将路由注册到VM组件中 3.定义组件 4.页面定义跳转路径 <!DOCTYPE html> <html> <head ...
- 浅谈BSGS(大步小步)及其扩展
用途: 一般用来求\(a^x\equiv b\,\,(mod\,p)\)的最小正整数解,其中gcd(a,p)=1 设\(u=\lceil sqrt(p)\rceil\),则式子可以转化为\(a^{iu ...
- Shoi2017试题泛做
一口气做完六个省的省选(误) Day1 [Shoi2017]期末考试 枚举最大的天数,然后代价贪心地O(1)计算. #include <cstdio> #include <algor ...
- UVA 11988 Broken Keyboard (a.k.a. Beiju Text)(链表)
题目代号:UVA 11988 题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&pa ...