- ?
100个Excel表格文件要合并?教你一招轻松搞定,一劳永逸!
Irina
展开
之前写过一篇文章,介绍如何合并一个 Excel 文件中的多个工作表。
以后如果碰到要合并12个月的
每一年的
全部学院的
还有来自五湖四海的
各种五花八门成千上万行的数据,都可以在几秒内轻松搞定。
不用函数公式,不用编写VBA代码,还能自动更新。
体验了这一个功能,我就对 Excel 2016 的查询功能爱不释手了!还能不能更牛C一点呢?
很多时候,我们要汇总合并的表格不在一个文件里头。
比如,做好报名人员信息登记表模板,群发给了100个训练班的班主任。他们登记好表格表格发回给我,肯定是分开一个个文件的呀。有没有办法把他们自动合并到一个汇总表里头呢?
再比如,我每周都要汇总一次公司所有产品的销售明细,拿到手的却只有单周数据。难道我还要每周复制粘贴,每周重做一遍统计工作吗?
这不科学
……
幸好幸好,查询这个功能还可以合并多个文件中的多个表格。操作起来和汇总单个文件中的多个表差不多,只是多了几步而已。
以每个业务员发出的赠品明细表为例。每人提交的表格文件,统一放入一个文件夹中。
接下来我们就看如何,用5个步骤,将这个文件夹里的所有表格数据全部提取出来合并到一个新的汇总表中。
第一步:导入文件夹
在数据选项卡下,【新建查询】-选择【从文件】-【文件夹选项】。
导入文件夹后,跟随提示进入查询编辑器。
上一篇文章,在导入单个Excel文件中的多个工作表后,直接就开始对数据进行整理操作了。
但是这一次导入的是文件夹中的多个Excel文件,目前为止获取到的数据,都是Excel工作簿的名称、格式、创建日期等文件基本信息,还没有文件夹、工作簿的“外壳”包裹着。
所以需要额外做的是穿透文件夹、工作簿,提取到每个工作簿中的表格和数据。
第二步:提取工作簿
要穿透工作簿提取出工作表,需要在查询编辑器中创建一个辅助列。所以,先选择【添加列】-【添加自定义列】。
然后添加自定义对话窗中,写入一条公式。
(别担心,很短,只要一模一样复制过去就可以了)
=Excel.Workbook([Content])
注意,一定要一模一样,包括字母大小写。
一定要用英文符号!一定要用英文符号!一定要用英文符号!
重要的事情说三遍
点击确定以后,就将文件夹中的全部 Excel 工作簿放入编辑器中。
第三步:提取工作表
点击自定义列旁边的扩展按钮,展开按钮工作表列表。
再继续提取工作表中的详细数据。
第四步:提取数据
点击Custom.Data列旁的扩展按钮,就能展开明细数据。
第五步:清洗数据
后面的操作就和上一篇操作步骤一样了。再简单复习一遍。选中需要保留的数据列,然后删除其他列。
将第一行设为标题行。
去除标题同名数据行、Null空行,筛选出最终需要的汇总数据。
第六步:完成合并
将加工完成的数据加载至工作表中。以后再添加新工作表,直接丢进文件夹,然后打开合并中刷新查询就行。
Tips:如果从管理系统中导出的文件是 CSV、TXT 等文本格式的文件就更加简单。从文件夹导入数据到查询编辑器之后,不需要写公式提取工作表,直接将 Content 列扩展即可。
扩展得到数据列表后,继续扩展得到详细数据,再按照上述步骤清洗数据,就能达到同样的查询效果。
看,就是简单的点击操作,最复杂的也就是一行固定不变的简短代码,=Excel.Workbook([Content])
意思是来源于 Excel 软件的工作簿内容。
有了这一招,只要搭建好统计报表的框架,数据引用自合并以后的汇总表。以后有新的数据表,就丢进文件夹里 100 多份表格汇总、统计分析、别人几天的工作量,每月来一次。
就这样轻轻松松点击一下刷新,搞定!可以喝咖啡去咯~
- ?
PHPexcel读取excel数据
盼波
展开
PHPExcel是一个PHP类库,用来帮助我们简单、高效实现从Excel读取Excel的数据和导出数据到Excel。也是我们日常开发中,经常会遇到的使用场景。PHPExcel可以快速导入客户信息,避免人工录入信息的麻烦。这里分享下读取数据的过程
1. 下载PHPexcel, 我这里下载的PHPExcel-1.8
2. 将下载的文件解压缩拷贝到项目目录中,如图:
3. 准备好要读取的excel文件,如图:
4. 加载PHPexcel文件并读取数据:
5. 读取结果如下:
- ?
Java读取TXT文件的方法
Odetta
展开
java读取txt文件内容。可以作如下理解:
首先获得一个文件句柄。File file = new File(); file即为文件句柄。两人之间连通电话网络了。接下来可以开始打电话了。
通过这条线路读取甲方的信息:new FileInputStream(file) 目前这个信息已经读进来内存当中了。接下来需要解读成乙方可以理解的东西
既然你使用了FileInputStream()。那么对应的需要使用InputStreamReader()这个方法进行解读刚才装进来内存当中的数据
解读完成后要输出呀。那当然要转换成IO可以识别的数据呀。那就需要调用字节码读取的方法BufferedReader()。同时使用bufferedReader()的readline()方法读取txt文件中的每一行数据哈。
package com.campu; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.Reader; /** * @author Java团长 * H20121012.java Java学习交流QQ群:589809992 我们一起学Java! * 2017-09-26下午18:52 */ public class H20121012 { /** * 功能:Java读取txt文件的内容 * 步骤:1:先获得文件句柄 * 2:获得文件句柄当做是输入一个字节码流,需要对这个输入流进行读取 * 3:读取到输入流后,需要读取生成字节流 * 4:一行一行的输出。readline()。 * 备注:需要考虑的是异常情况 * @param filePath */ public static void readTxtFile(String filePath){ try { String encoding="GBK"; File file=new File(filePath); if(file.isFile() && file.exists()){ //判断文件是否存在 InputStreamReader read = new InputStreamReader( new FileInputStream(file),encoding);//考虑到编码格式 BufferedReader bufferedReader = new BufferedReader(read); String lineTxt = null; while((lineTxt = bufferedReader.readLine()) != null){ System.out.println(lineTxt); } read.close(); }else{ System.out.println("找不到指定的文件"); } } catch (Exception e) { System.out.println("读取文件内容出错"); e.printStackTrace(); } } public static void main(String argv[]){ String filePath = "L:\\Apache\\htdocs\\res\\20121012.txt"; // "res/"; readTxtFile(filePath); } }
- ?
Java中如何高效的读取大文件
笑槐
展开
在java编程中, 我想大部分小伙伴都在使用BufferReader,那么是否有更高效的读取方式呢?
Java IO包的更新为我们的带来了更高的效率.
这里我会用1GB的文件测试,来对比一下几种方法的性能差异:
使用Java BufferReader
Max Memory Used : 258MB
Time Take : 100 Seconds
使用Java8 Stream API
Max Memory Used :390M
BTime Take : 60 Seconds
使用Java Scanner
Max Memory Used : 460MB
Time Take : 60 Seconds
使用Apache common IO
Max Memory Used :400MB
Time Take : 60 Seconds
从上面的测试中我们可以得出结论:
BufferReader效率是最低的,如果可以,还是换掉它吧.
- ?
R学习笔记系列—R语言从文本和Excel文件中读取数据
第三
展开
1.4.1 从文本文件中导入数据
可以使用 read.table() 函数从带分隔符的文本文件中导入数。调用格式为:
这个函数看上去很复杂,但其实很多参数在使用时不用明确指出来,使用默认值可以满足绝大部分情况,因此实际使用还是比较简单的,下面我们简单介绍一下参数含义。
file: 字符型,文件名称,要从中读取文件的完整路径。
header: 逻辑型,指定是否在首行包含变量名,默认为 FALSE。
sep: 字符型,分割字符,默认为"",代表空白字符,包括空格(一个或多个)、制表符、 换行符、回车
dec: 字符型,指定小数点字符,默认为".",一般不用修改。
numerals: 字符型,在数字转换会损失精度时的处理方法,allow.loss 表示允许精度损失;warn.loss 允许精度损失,但显示一条警告信息;no.loss 不允许精度损失,即转换为数字,而是转换为因子或者不转换,保留字符串形式。
row.names 字符向量,为行指定名称。
col.names 字符向量,为列指定名称,若列名在第一行定义好了,可不用。
stringAsFactors: 逻辑型,是否将字符串自动编码为因子,默认为 TRUE。
na.strings: 字符向量,定义代表缺失值的字符串,比如c("N",".")会将 "N" 和"." 两个字符读取为缺失值,默认为 "NA"。
colClasses: 字符向量为列指定类型,比如c("numeric","character")指定第一列为数值型,第二列为字符型,若将某列指定为字符串,则不会将其自动编码为因子。
nrows: 数值型,读取的最大行数,负数为不限制。
skip: 数值型,读取前跳过的行数。
check.names: 逻辑型,是否检查变量名在 R 中的有效性,默认为 TRUE。
fill: 逻辑型,是否自动填充空白值,若各变量行数不一致,是否为空白列添加空白值。
strip.white: 逻辑型,是否自动过滤掉字符型变量前后的空格。
comment.char: 字符型,注释字符,以此字符开头的行将被忽略。
blank.lines.skip 逻辑型,是否忽略空白行,默认为 TRUE。
allowEscapes: 逻辑型,是否处理 C 语言风格的转意符。
text: 字符型,直接指定要读取的字符串,此时 file 应该为空。
encoding: 字符型,输入文本的编码,若出现乱码,请尝试更改此选项。
fileEncoding: 字符型,文件编码,若出现乱码,请尝试更改此选项。
假定我们有一个文本文件,students.txt,记录了6个学生的性别、身高和体重情况,其内容如下:
那么我们可以用以下方式读取:
read.table() 是读取按行列组织的数据的基础方式,其它同类函数,比如 read.csv() 等其实是用特定的选项调用了 read.table() 函数。在 read.table() 函数时,应尽量注意以下几点。
1.建议明确地在首行定义变量名,并加上参数 header = TRUE。
2.默认的分隔符为"",可以用空格、制表符、换行符等空白字符分割内容,若非空白分割,则需明确指出。
3.字符型变量会被自动转换为因子型,在读大型文件时,将 stringsAsFactors 设置为 False,能加快读取速度。
4.默认情况下,read.table 用 # 作为注释标识字符。如果碰到该字符(除了在被引用的字符串内),该行中随后的内容将会被忽略。
5.read.table()会尽量为每个变量选择合适的数据类型,若你想明确指定请用colClasses,或者生成后根据需要修改。
6.若读中文时出现乱码,请尝试改变编码
1.4.2 从 Excel 表格中读取
从 Excel 里读取数据最简单的办法就是将 Excel 表格存储为以逗号分割的 csv 文件,然后用 read.csv() 函数读取。read.csv() 函数其实就是 read.table() 的定制版,其用法与 read.table() 基本一致。
若要直接读取 Excel 文件,则需安装专门的包,本书推荐 readxl 包。
readxl 中有若干读取 Excel 数据的函数,最常用的是 read.excel()。调用格式为:
path: 字符型,文件路径sheet: 字符型或数值型。若为字符型,则指定 Sheet 名;若为数值,则指定 Sheet 的位置;若不指定,默认第一个Sheetrange: 字符型或数值型,读取的单元格范围,比较复杂,请查看文档col_names: 逻辑型或字符型向量;若为逻辑型,则指定是否将第一行作为变量名;若为字符向量,则直接定义各列名col_types: 字符型向量,定义各列数据类型,比如c("numeric","character");若不指定,则自动匹配na: 字符型向量,指定读取为缺失值的字符串 ,默认情况下,会将空单元格读取为缺失值trim_ws: 逻辑型,是否自动过滤掉字符型变量前后的空白(空格、制表符、换行符skip: 数值型,读取前跳过的行数,因为空白的行会自动跳过,所以这是最小的被跳过的行数n_max: 数值型,最大读取行数guess_max: 数值型,猜测列类别时,检测的最大行数
假如,在 d 盘有一名为 students.xls 的 Excel 文件,你可以通过如下方式读取。
喜欢闲适安静的生活,懂一点计算机编程,懂一点统计学和数据分析。(爱编程爱统计)
- ?
VS2017下编写C 程序读写Excel文件
昌峻熙
展开
前言:
有时候我们需要对Excel文件进行特殊处理,这种情况下写个小程序是很方便的。最近刚开始学C#,正好有同学需要处理个Excel文件,我就写了一个程序。发现网上虽有资料,但很多行不通,特此记录,以免后来人少走弯路。
正文:
首先,界面如下,当然,程序员不需要看界面,从代码中就可以直接学习。
然后,需要下载一个文件“Microsoft.Office.Interop.Excel.dll”,自行网搜。导入到引用之中。然后也把System.Windows.Forms加入引用。
最后,上代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
//ghw:add
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
namespace WpfExcel
{
///
/// MainWindow.xaml 的交互逻辑
///
public partial class MainWindow : Window
{
public Excel.Application excel;
public Excel.Workbooks wbs;
public Excel.Workbook wb;
public Excel.Worksheets wss;
public Excel.Worksheet ws;
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
System.Windows.Forms.OpenFileDialog fd = new OpenFileDialog();
fd.Filter = @"Excel文件(*.xls; *.xlsx)|*.xls; *.xlsx|All File(*.*)|*.*";
if(fd.ShowDialog()==System.Windows.Forms.DialogResult.OK)
{
filePath.Text = fd.FileName;
}
}
private void BtnAna_Click(object sender, RoutedEventArgs e)
{
try
{
excel= new Excel.Application();
wbs = excel.Workbooks;
wb = wbs.Add(filePath.Text);
int ncount = wb.Worksheets.Count;
if (ncount < 1)
{
System.Windows.Forms.MessageBox.Show("没有内容");
return;
}
else
{
// System.Windows.Forms.MessageBox.Show("ok,继续");
}
for(int i=0; i
{
ws = (Excel.Worksheet)wb.Sheets.Item[i+1];
cbSheet.Items.Add(ws.Name);
}
cbSheet.Text = ws.Name;
for(int i=0;i<10;i++)
{
cbLeft.Items.Add(i+1);
cbLeftNum.Items.Add(i + 1);
cbRight.Items.Add(i + 1);
cbRightNum.Items.Add(i + 1);
}
cbLeft.Text = "2";
cbLeftNum.Text = "3";
cbRight.Text = "4";
cbRightNum.Text = "5";
// excel.Quit();
// excel = null;
}
catch(Exception ex)
{
System.Windows.Forms.MessageBox.Show("解析数据异常,请检查数据结构");
}
finally
{
excel.Quit();
excel = null;
}
}
private void BtnRes_Click(object sender, RoutedEventArgs e)
{
try
{
int nMin = Convert.ToInt32(tbMin.Text);
int nMax = Convert.ToInt32(tbMax.Text);
excel = new Excel.Application();
wbs = excel.Workbooks;
wb = wbs.Add(filePath.Text);
int ncount = wb.Worksheets.Count;
if (ncount < 1)
{
System.Windows.Forms.MessageBox.Show("没有内容");
return;
}
else
{
// System.Windows.Forms.MessageBox.Show("ok,继续");
}
ws = wb.Sheets[cbSheet.Text];
if(ws.Columns.Count<1)
{
System.Windows.Forms.MessageBox.Show("没有内容");
}
else
{
// System.Windows.Forms.MessageBox.Show("ok,继续");
}
string s1="01234";
int MaxIndex = 222;
string[,] lrData = new string[MaxIndex, 4];
int leftArr = Convert.ToInt32(cbLeft.Text);
int leftNumArr = Convert.ToInt32(cbLeftNum.Text);
int rightArr = Convert.ToInt32(cbRight.Text);
int rightNumArr = Convert.ToInt32(cbRightNum.Text);
int leftNum = 0;
for(int i=1;i< (MaxIndex+1);i++)
{
if(((Excel.Range)ws.Cells[i, leftArr]).Text =="")
{
break;
}
else
{
lrData[leftNum, 0]= ((Excel.Range)ws.Cells[leftNum+1, leftArr]).Text;
lrData[leftNum, 1] = ((Excel.Range)ws.Cells[leftNum + 1, leftNumArr]).Text;
leftNum++;
}
}
int rightNum = 0;
for (int i = 1; i < (MaxIndex + 1); i++)
{
if (((Excel.Range)ws.Cells[i, rightArr]).Text == "")
{
break;
}
else
{
lrData[rightNum, 2] = ((Excel.Range)ws.Cells[rightNum + 1, rightArr]).Text;
lrData[rightNum, 3] = ((Excel.Range)ws.Cells[rightNum + 1, rightNumArr]).Text;
rightNum++;
}
}
Excel.Worksheet ws1 = (Excel.Worksheet)wb.Worksheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
ws1.Name = "result";
int nl = 0;
int nr = 0;
for(int x=0;x
{
for(int y=0;y
{
ws1.Cells[x * rightNum + y + 1, 1] = lrData[x, 0];
ws1.Cells[x * rightNum + y + 1, 2] = lrData[x, 1];
ws1.Cells[x * rightNum + y + 1, 3] = lrData[y, 2];
ws1.Cells[x * rightNum + y + 1, 4] = lrData[y, 3];
ws1.Cells[x * rightNum + y + 1, 5] = lrData[x, 0] + lrData[y, 2];
ws1.Cells[x * rightNum + y + 1, 6] = lrData[x, 1] + "+" + lrData[y, 3];
nl = Convert.ToInt32(lrData[x, 1]);
nr = Convert.ToInt32(lrData[y, 3]);
ws1.Cells[x * rightNum + y + 1, 7] = Convert.ToString(nl + nr);
}
}
wb.SaveAs(cbSheet.Text+".xlsx");
wb.Save();
wb.Close();
System.Windows.Forms.MessageBox.Show("结果文件保存在 我的文档 中,命名为:"+ cbSheet.Text + ".xlsx");
}
catch(Exception ex)
{
System.Windows.Forms.MessageBox.Show("解析数据异常,请检查数据结构");
}
finally
{
excel.Quit();
excel = null;
}
}
}
}
写完之后,我觉得Excel公式可能很方便的就能实现这个程序的功能,我虽为程序员,但是真的对那些公式有点陌生,虽说学起来可能很快,但就是没学,竟然有种“隔行如隔山”的感觉。
不敢说自己没有时间,前段时间晚上回家,看完了《铁齿铜牙纪晓岚》四部曲,最近也看完了《宰相刘罗锅》,惭愧。
中间插:每日可行,长按copy本行 道4亚汇宁斯忆34挨非 打开阿里家的支F宝领钱。
我觉得应该没有人能看到这。如果有桌面无聊的人请留言哦!
C#现在真是尴尬,java在手机端(Android)和web端(服务器)上很有市场,C#想进入桌面应用,但是有老大哥MFC(C++),现在QT又风生水起,win7和WinXP份额还很大, 你认为,C-Sharp的前景怎么样呢?
真希望微软的真能跨平台啊,可惜微软短期内不会帮助竞争对手了。
助人者会助己吗?
要么C#死、Windows活,要么Windows死、C#活?
肯定不是。
平台不跨平台,C#顶多奄奄一息而已。
跨平台,Windows可能活的更好。
————分割线————
耿然原创,勤了周更,懒了月更。
欢迎评论、吐槽、爆料、投诉、建议。
评论比文章更精彩。
————分割线————
- ?
Java实现文件批量导入导出实例(兼容xls,xlsx)
经凝丝
展开
1、介绍
java实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写个小demo来理解其原理,没接触过的同学也可以看看参考下。
目前我所接触过的导入导出技术主要有POI和iReport,poi主要作为一些数据批量导入数据库,iReport做报表导出。另外还有jxl类似poi的方式,不过貌似很久没跟新了,2007之后的office好像也不支持,这里就不说了。
2、POI使用详解
2.1 什么是Apache POI?
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
2.2 POI的jar包导入
本次讲解使用maven工程,jar包版本使用poi-3.14和poi-ooxml-3.14。目前最新的版本是3.16。因为3.15以后相关api有更新,部分操作可能不一样,大家注意下。
2.3 POI的API讲解
2.3.1 结构
HSSF - 提供读写Microsoft Excel格式档案的功能。XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。HWPF - 提供读写Microsoft Word格式档案的功能。HSLF - 提供读写Microsoft PowerPoint格式档案的功能。HDGF - 提供读写Microsoft Visio格式档案的功能。
2.3.2 对象
本文主要介绍HSSF和XSSF两种组件,简单的讲HSSF用来操作Office 2007版本前excel.xls文件,XSSF用来操作Office 2007版本后的excel.xlsx文件,注意二者的后缀是不一样的。
HSSF在org.apache.poi.hssf.usermodel包中。它实现了Workbook 接口,用于Excel文件中的.xls格式
常用组件:HSSFWorkbook excel的文档对象HSSFSheet excel的表单HSSFRow excel的行HSSFCell excel的格子单元HSSFFont excel字体HSSFDataFormat 日期格式HSSFHeader sheet头HSSFFooter sheet尾(只有打印的时候才能看到效果)样式:HSSFCellStyle cell样式辅助操作包括:HSSFDateUtil 日期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表
XSSF在org.apache.xssf.usemodel包,并实现Workbook接口,用于Excel文件中的.xlsx格式
常用组件:XSSFWorkbook excel的文档对象XSSFSheet excel的表单XSSFRow excel的行XSSFCell excel的格子单元XSSFFont excel字体XSSFDataFormat 日期格式和HSSF类似;
2.3.3 两个组件共同的字段类型描述
其实两个组件就是针对excel的两种格式,大部分的操作都是相同的。
2.3.4 操作步骤
以HSSF为例,XSSF操作相同。
首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。
3、代码操作
3.1 效果图
惯例,贴代码前先看效果图
Excel文件两种格式各一个:
代码结构:
导入后:(我导入了两遍,没做校验)
导出效果:
3.2 代码详解
这里我以Spring+SpringMVC+Mybatis为基础
Controller:
Service
3.3 导出文件api补充
大家可以看到上面service的代码只是最基本的导出。
在实际应用中导出的Excel文件往往需要阅读和打印的,这就需要对输出的Excel文档进行排版和样式的设置,主要操作有合并单元格、设置单元格样式、设置字体样式等。
3.3.1 单元格合并
使用HSSFSheet的addMergedRegion()方法
参数CellRangeAddress 表示合并的区域,构造方法如下:依次表示起始行,截至行,起始列, 截至列
3.3.2 设置单元格的行高和列宽
3.3.3 设置单元格样式
1、创建HSSFCellStyle
2、设置样式
3、将样式应用于单元格
3.3.4设置字体样式
1、创建HSSFFont对象(调用HSSFWorkbook 的createFont方法)
2、设置字体各种样式
3、将字体设置到单元格样式
大家可以看出用poi导出文件还是比较麻烦的,等下次在为大家介绍下irport的方法。
导出的api基本上就是这些,最后也希望上文对大家能有所帮助。
学习Java的同学注意了!!!学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群495273252,我们一起学Java!
- ?
集算器协助java处理多样性数据源之Excel
岑寂
展开
Java程序员读取和计算excel的程序一般要使用poi或其它开源包,这些开源包对编程的支持较为底层,整体学习成本和操作复杂度都很高。使用集算器辅助java处理excel文件就可以避免这些事务。
下面通过一个例子看一下具体作法:从Excel文件orders.xls中读取订单信息,找出2010年1月1日(含)之后,SELLERID等于18的订单。orders.xls的内容如下:
实现的思路是:用Java程序调用集算器脚本,读取和计算excel文件中的数据,之后将结果以ResultSet的方式返回给Java程序。由于集算器支持动态表达式解析和求值,使得Java程序可以像使用sql那样,灵活的处理数据。
首先,程序员可以将条件“2010年1月1日(含)之后,并且SELLERID等于18的订单。”作为参数where传递给esProc程序,如下图:
where是个字串,其值为:ORDERDATE>=date(2010,1,1) && SELLERID==18。
esProc的程序代码如下:
A2:按照条件过滤。这里使用宏来实现动态解析表达式,其中的where就是传入参数。集算器将先计算${…}里的表达式,将计算结果作为宏字符串值替换${…}之后解释执行。这个例子中最终执行的是:=A1.select(ORDERDATE>=date(2010,1,1) && SELLERID==18)。A1:定义一个file对象,导入excel数据。esProc的集成开发环境可以直观的显示出导入的数据,如上图右边部分。importxls函数也可以读写xlsx文件,它会根据文件扩展名自动判断excel的版本。
A3:将符合条件的结果集返回给java。如果需要将结果写入另外一个excel文件,只要将A3单元格改为:=file("D:/file/orders_result.xls").exportxls@t(A2)。
过滤条件发生变化时不用改变程序,只需改变where参数即可。例如,条件变为:2010年1月1日(含)之后,并且SELLERID等于18的订单,或者CLIENT等于PWQ的订单。Where的参数值可以写为:CLIENT=="PWQ"||ORDERDATE>=date(2010,1,1) && SELLERID==18。执行之后,A2中的结果集如下图:
在Java程序中使用esProc JDBC调用这段程序获得结果的代码如下:(将上述esProc程序保存为test.dfx):
//建立esProc jdbc连接
Class.forName("com.esproc.jdbc.InternalDriver");
con= DriverManager.getConnection("jdbc:esproc:local://");
//调用esProc程序(存储过程),其中test是dfx的文件名
com.esproc.jdbc.InternalCStatementst =(com.esproc.jdbc.InternalCStatement)con.prepareCall("call test(?)");
//设置参数
st.setObject(1,"ORDERDATE>=date(2010,1,1) && SELLERID==18 || CLIENT==\"PWQ\"");//执行esProc存储过程
ResultSet set =st.executeQuery();
对于代码较简单的脚本,还可以把代码直接写在调用集算器JDBC的Java程序中,而不必专门编写脚本文件(test.dfx):
ResultSet set = st.executeQuery(
"=file(\"D:/file/orders.xls\").importxls@t().select(ORDERDATE>=date(2010,1,1) && SELLERID==18 || CLIENT==\"PWQ\")");
这段Java代码直接调用了集算器的一句脚本:从Excel文件中取得数据,并按照指定的条件过滤。
- ?
一行代码完成Java的Excel读写
Lin
展开
前段时间在 github 上发现了阿里的 EasyExcel 项目,觉得挺不错的,就写了一个简单的方法封装,做到只用一个函数就完成 Excel 的导入或者导。刚好前段时间更新修复了一些 BUG,就把我的这个封装分享出来,请多多指教。
附上源码:
https://github/HowieYuan/easyexcel-method-encapsulation
EasyExcel
EasyExcel 的 github 地址:
https://github/alibaba/easyexcel
EasyExcel 的官方介绍:
可以看到 EasyExcel 最大的特点就是使用内存少,当然现在它的功能还比较简单,能够面对的复杂场景比较少,不过基本的读写完全可以满足。
一. 依赖
首先是添加该项目的依赖,目前的版本是 1.0.2。
com.alibaba easyexcel 1.0.2 二. 需要的类
1. ExcelUtil
工具类,可以直接调用该工具类的方法完成 Excel 的读或者写。
2. ExcelListener
监听类,可以根据需要与自己的情况,自定义处理获取到的数据,我这里只是简单地把数据添加到一个 List 里面。
publicclassExcelListenerextendsAnalysisEventListener {//自定义用于暂时存储data。//可以通过实例获取该值private List
3. ExcelWriterFactroy
用于导出多个 sheet 的 Excel,通过多次调用 write 方法写入多个 sheet。
4. ExcelException
捕获相关 Exception。
三. 读取 Excel
读取 Excel 时只需要调用 ExcelUtil.readExcel() 方法:
@RequestMapping(value = "readExcel", method = RequestMethod.POST)public Object readExcel(MultipartFile excel) {return ExcelUtil.readExcel(excel, new ImportInfo());}
其中 excel 是 MultipartFile 类型的文件对象,而 new ImportInfo() 是该 Excel 所映射的实体对象,需要继承 BaseRowModel 类,如:
publicclass ImportInfo extends BaseRowModel {@ExcelProperty(index = 0)privateString name;@ExcelProperty(index = 1)privateString age;@ExcelProperty(index = 2)privateString email;publicString getName() {return name; }publicvoid setName(String name) {this.name = name; }publicString getAge() {return age; }publicvoid setAge(String age) {this.age = age; }publicString getEmail() {return email; }publicvoid setEmail(String email) {this.email = email; }}
作为映射实体类,通过 @ExcelProperty 注解与 index 变量可以标注成员变量所映射的列,同时不可缺少 setter 方法。
四. 导出 Excel
1. 导出的 Excel 只拥有一个 sheet
只需要调用 ExcelUtil.writeExcelWithSheets() 方法:
@RequestMapping(value = "writeExcel", method = RequestMethod.GET)publicvoidwriteExcel(HttpServletResponse response) throws IOException { List
list = getList(); String fileName = "一个 Excel 文件"; String sheetName = "第一个 sheet"; ExcelUtil.writeExcel(response, list, fileName, sheetName, new ExportInfo()); } fileName,sheetName 分别是导出文件的文件名和 sheet 名,new ExportInfo() 为导出数据的映射实体对象,list 为导出数据。
对于映射实体类,可以根据需要通过 @ExcelProperty 注解自定义表头,当然同样需要继承 BaseRowModel 类,如:
publicclass ExportInfo extends BaseRowModel {@ExcelProperty(value = "姓名" ,index = 0)privateString name;@ExcelProperty(value = "年龄",index = 1)privateString age;@ExcelProperty(value = "邮箱",index = 2)privateString email;@ExcelProperty(value = "地址",index = 3)privateString address;}
value 为列名,index 为列的序号。
如果需要复杂一点,可以实现如下图的效果:
对应的实体类写法如下:
publicclass MultiLineHeadExcelModel extends BaseRowModel {@ExcelProperty(value = {"表头1","表头1","表头31"},index = 0)privateString p1;@ExcelProperty(value = {"表头1","表头1","表头32"},index = 1)privateString p2;@ExcelProperty(value = {"表头3","表头3","表头3"},index = 2)private int p3;@ExcelProperty(value = {"表头4","表头4","表头4"},index = 3)private long p4;@ExcelProperty(value = {"表头5","表头51","表头52"},index = 4)privateString p5;@ExcelProperty(value = {"表头6","表头61","表头611"},index = 5)privateString p6;@ExcelProperty(value = {"表头6","表头61","表头612"},index = 6)privateString p7;@ExcelProperty(value = {"表头6","表头62","表头621"},index = 7)privateString p8;@ExcelProperty(value = {"表头6","表头62","表头622"},index = 8)privateString p9;}
2. 导出的 Excel 拥有多个 sheet
调用 ExcelUtil.writeExcelWithSheets() 处理第一个 sheet,之后调用 write() 方法依次处理之后的 sheet,最后使用 finish() 方法结束。
publicvoidwriteExcelWithSheets(HttpServletResponse response) throws IOException { List
list = getList(); String fileName = "一个 Excel 文件"; String sheetName1 = "第一个 sheet"; String sheetName2 = "第二个 sheet"; String sheetName3 = "第三个 sheet"; ExcelUtil.writeExcelWithSheets(response, list, fileName, sheetName1, new ExportInfo()) .write(list, sheetName2, new ExportInfo()) .write(list, sheetName3, new ExportInfo()) .finish();} write 方法的参数为当前 sheet 的 list 数据,当前 sheet 名以及对应的映射类。
扩展阅读
代码整洁之道|最佳实践小结
Javascript 将 HTML 页面生成 PDF 并下载
Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框
来源:https://juejin.im/post/5ba320546fb9a05d0b14304b
文章来源网络,版权归作者本人所有,如侵犯到原作者权益,请与我们联系删除
- ?
整理关于java读取excel内容的例子供大家参考
大热
展开
1POI简介
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
2POI下载
poi下载地址:https://apache.org/dyn/closer.lua/poi/release/bin/poi-bin-3.17-20170915.tar.gz
下载之后把压缩包解压,然后在项目里面引用解压文件夹里面的jar
3新建java project,引入poi相关的jar
4创建一个java类,编写代码
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class ReadExcel {
/**
* @param args
*/
@SuppressWarnings("resource")
public static void main(String[] args) {
try {
InputStream is = new FileInputStream(new File(
"D:/360bizhi/0_TITLE_CODE.xls"));
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
// 获取每一个工作薄
for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
}
// 获取当前工作薄的每一行
for (int rowNum = 0; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
if (hssfRow != null) {
String title_id = String.valueOf(hssfRow.getCell(0));
// 读取第一列数据
String title_name = String.valueOf(hssfRow.getCell(1));
// 读取第二列数据
String title_name_en = String.valueOf(hssfRow
.getCell(2));
System.out.println("===============title_id:"
+ title_id + ",title_name:" + title_name
+ ",title_name_en:" + title_name_en);
} catch (Exception e) {
e.printStackTrace();
5运行main进行测试,查看打印结果
打印结果和xls里面的值是一样的,说明读取excel成功
请大家多多关注我的头条号,谢谢大家
java读取excel文件
-
1、只需3秒快速实现求和
-
2、如何快速填充序号
-
3、如何自动填充序号(公式法)
-
4、数据条的神奇应用
-
5、多文本快速合并
-
6、查找与替换的不同玩法
-
7、快速定位到指定区域
-
8、数据排序、工资条制作
-
9、快速筛选(模糊、精确筛选)
-
10、快速插入空行
-
11、快速删除空行
-
12.快速跳转到天涯海角
-
13、.同时查看两个Excel文件
-
14、用条件格式扮靓报表
-
15、一键插入Excel图表
-
16、批量处理行高、列宽
-
17、利用拆分功能查看数据
-
18、批量录入相同内容
-
19、工作表快速跳转
-
20、批量录入表格模板(精品课程)
-
21、Excel函数与公式的应用、公式循环引用的查找
-
22、IF函数单条件判断同比增长
-
23、用sum函数 格式相同,连续多表数据汇总
-
24、excel快捷键
-
25、VLOOKUP函数——根据销售员匹配销售额
-
26、统计各部门销售总额
-
27、统计指定条件个数
-
28、怎样输入当前日期和时间、星期数
-
29、销售业绩排名
-
30、Sumproduct函数-万能函数(销售额汇总求和)
-
31、根据销售员,地区,商品名称汇总
-
32、批量替换PPT字体
-
33、给销售额数据批量添加万元单位
-
34、一秒快速核对两列数据
-
35、快速定位到指定单元格或区域
-
36、快速制作双行标题工资条
-
37、给你的表格做个瘦身
-
38、快速打开常用的Excel文件
-
39、快速打开多个Excel文件
-
40、利用创建组—快速隐藏/展开多列数据
-
41、快速制作下拉菜单
-
42、复制粘贴表格,如何保留数据源列宽格式一致?
-
43、两列数据位置互换
-
44、1秒钟扮靓报表——如何实现表格隔行换色
-
45、快速删除重复记录——保留唯一值
-
46、快速向下填充、向右填充,文本或公式
-
47、给Excel文件添加密码
-
48、插入带图片的批注
-
49、输入公式后不计算?
-
50、如何设置单元格缩进
-
51、快速解决Excel表格总显示货币格式
-
52、批量添加万元单位
-
53、你会四舍五入么?
-
54、用RAND函数机选彩票
-
55、冻结首行你会么?
-
56、超链接的高级应用
-
57、IFERROR函数-屏蔽错误值
-
58、批量填充颜色
-
59、录入数据
-
60、快速输入工号
-
61、快速行列转置
-
62、自定义缩放界面
-
63、多个单元格同时输入
-
64、如何计算立方米?
-
65、快速制作双行标题工资条
-
66、输入带方框的√和×
-
67、快速将姓名对齐
-
68、快速输入性别
-
69、按单位职务排序
-
70、自动计算合同到期日期
-
71、计算时间间隔
-
72、日期和时间的拆分
-
73、快速处理不规范的日期格式
-
74、快速填充合并单元格
-
75、效率加倍的快捷键
-
76、快速复制表格和对象
-
77、快速创建工作表副本
-
78、快速复制序列号
-
79、快速显示公式
-
80、多个单元格同时输入
-
81、快速调整显示比例
-
82、快速自动填充
-
83、快速填充(Ctrl+E)
-
84、Ctrl与数字键结合
-
85、快速将多列数据整理为1列
-
86、快速将1列数据拆分为多列
-
87、快速定位公式
-
88、快速录入数据
-
89、快速累计求和
-
90、身份证号码显示为0怎么办?
-
91、快速制作斜线表头
-
92、文本竖向显示
-
93、神奇的监视窗口
-
94、不一样的格式刷
-
95、快速美化图表
-
96、快速生成当前日期
-
97、快速找出循环引用
-
98、快速提取信息
-
99、二维表快速转换为一维表
-
100、快速多表合并