原谅我的表述能力有限,刚接到这个小活的时候,我以为很简单,但当我打开那个含有300+sheet页的excel表格时,我开始慌了。这300多个sheet中其中有30多个目录页,我的工作就是根据这30多个目录拆分excel。方法也许很麻烦,但是我实在不想重复点链接,复制,粘贴这无休止的工作方式。
首先我利用java根据这些目录把该目录下的sheet名拿到:
public static void main(String[] args) {
try {
HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream("D://jhc.xls"));
int sum = wb.getNumberOfSheets();
int num = 0;
for(int i=1;i<sum;i++){
HSSFSheet sheet = wb.getSheetAt(i);
Map map = new HashMap();
for(Row row :sheet){
for(Cell cell : row){
if(cell.getHyperlink()!=null){
String str = cell.getHyperlink().getAddress();
str = str.replaceAll("!A1", "").replaceAll("'", "");
Sheet sheet1 = wb.getSheet(str);
int location = wb.getSheetIndex(str);
map.put(str, location);
}
}
}
if(map.size()!=0){
num++;
map.put(sheet.getSheetName(), i);
Iterator<String> iter = map.keySet().iterator();
while (iter.hasNext()) {
String key = iter.next();
int value = (int) map.get(key);
System.out.print("\""+key+"\",");
}
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
接下来我尝试用java来代替我完成复制粘贴的工作,但是合并单元格的情况我没有考虑到,导致程序运行失败,后来查资料的时候发现了一个更简单的方法,打开要拆分的excel以及一个新建的excel表格 Alt+F11点击工具进入宏,输入以下代码:
Sub copy()
Dim arrs() As Variant
Dim arr As Variant
arrs = Array("这里添加java输出的那一段字符串")
For Each arr In arrs
Workbooks("copy.xlsx").Worksheets.Add().Name = arr
Next
For Each arr In arrs
Workbooks("jhc.xlsx").Sheets(arr).Cells.copy Destination:=Workbooks("copy.xlsx").Sheets(arr).Cells(1, 1)
Next
End Sub
OK了,整个工作结束了,研究这些耗费了我两天的时间。其实如果一个一个复制粘贴的话也许耗时比这更短,但是我本着能用代码解决的问题尽量少BB的原则完成这项任务。很享受这两天的经历,毕竟打两天代码比复制粘贴有意义的多。这是我的第一篇博客。以后我会把我工作遇到的有意思的事情与大家一起分享!