- ?
SpreadJS ExcelIO实现服务器端Excel导入导出
透露
展开
SpreadJS在V10版本后推出了纯前端的Excel导入导出,这个功能可以很方便的实现客户端的Excel导入导出,但是如果用户需要导入导出到浏览器端又该怎么办呢?其实纯前端的Excel导入导出同样可以实现服务器端的Excel导入导出。下面让我们来看一下是如何实现的:
本示例的后端使用JAVA语言,通过SpreadJS的前端导出导出与JAVA后端结合,实现分从服务器端导入Excel与导出Excel保存至服务器端这两个功能:
从服务器端导入Excel:
这部分使用纯前端实现,纯前端实现有一个弊端就是,浏览器没有权限访问服务器上工程目录以外的路径,所以需要将服务器端的Excel放入工程目录下。然后下载到前端直接打开,核心代码如下:
导出Excel保存至服务器端:
这部分使用前端导出功能与后端java结合的方式来实现,首先通过前端Excel导出,生成导出文件,然后通过formdata来承载导出文件,之后通过ajax将formdata传至后端java。后端java使用文件操作将文件保存至服务器端。
这里有以下需要注意的地方:
formdata没有办法改变enctype,而我们需要的用entype为multipart/form-data类型的form来承载导出文件。这里需要在jsp页面上创建一个空的form,并将其entype设置为multipart/form-data:
之后js中只需要初始化一个该form的formdata实例即可:
var fd = new FormData(document.forms.namedItem("myform"));
以上就是核心的部分代码以及原理。
了解更多
SpreadJS是 Spread 表格开发系列产品之一。该产品是葡萄城公司出品的一系列功能和 Excel 类似的表格工具,支持桌面、Web 和移动平台开发,用于在应用系统中实现 Excel 导入导出、表格数据录入和编辑等交互功能,并提供灵活的定制能力和丰富的数据可视化效果。
Spread 是目前市面上最接近 Excel 的表格开发工具,无论是界面、函数还是布局,都与 Excel 高度接近,正被华为、东软、中国平安、河海大学、中通快递、普华永道、魔方网表、思源软件等企业应用于项目开发中。
除了纯前端的SpreadJS,该系列产品还包括 .NET 平台可用的Spread Studio,和服务器端批量操作Excel的Spread表格组件,敬请登陆官网了解更多:http://gcpowertools/
关于葡萄城
葡萄城成立于1980年,是全球最大的控件提供商,世界领先的企业应用定制工具、企业报表和商业智能解决方案提供商,为超过75%的全球财富500强企业提供服务。葡萄城于1988年在中国设立研发中心,在全球化产品的研发过程中,不断适应中国市场的本地需求,并为软件企业和各行业的信息化提供优秀的软件工具和咨询服务。
- ?
JavaEE——Java导出Excel表
依波
展开
声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。
Java导出Excel表
首先去maven里面下载 upload 1.3.3 版本 下载到你的maven工程里面
上传文件必须是post方法
上传文件同时有表单值的话 你用request.getParame是获得不到的
Java导出Excel表
去maven工厂下载 POI jar包
- ?
黑马程序员:程序员必看:如何用Python实现Excel读写与处理!
Yale
展开
本篇文章讲的是Excel文件的读写和处理。Excel除了是普通生活中应用广泛的数据处理软件和数据保存格式外,在商业分析中也占有非常大的重量,熟练使用Excel软件是数据分析师很关键的技能点,但这篇笔记不是讲各类Excel函数和快捷键,而是讲Python对Excel的 .xls 和 .xlsx 格式数据的读写和处理。
目录
Excel文件简介Excel文件的读取Excel文件的写入pandas库读写Excel筛选与统计量计算
Excel文件简介
Excel其实相信大家都不陌生,一个 .xls(Excel 2013后默认格式为 .xlsx )文件是一个工作簿(workbook),包含多个表(worksheet),每个表内数据按照行列进行组织,书中第三章的用词中,“文件”和“工作簿”表示同一个对象。拿本篇笔记用到的示例文件
sales_2015.xlsx 为例:
本篇笔记需要用到两个库: xlrd 和 xlwt,这两个库不是内置模块,但安装了Anaconda集成环境的话,这两个库被包含了,可以通过 import xlrd 和 import xlwt 进行测试,如果提示未安装,可以通过命令行下用pip安装,本处不展开。xlrd用来读取Excel文件,xlwt用于构建Workbook对象进行Excel文件的创建和写入数据。这两个库不能对Excel文件进行直接更改,因此思路是
复制一份数据到内存进行分析计算,再写入新Excel文件中
。需要直接性地修改可以考虑VBA吧,VBA(Visual Basic for Applications)是目前 Office 套件支持的基于 Visual Basic 的宏语言,目前一般在Excel或PPT内进行编程实现高级效果(如Excel数据的批量修改)一般都用VBA,当然以后Office要内置Python了,现在学好Python以后就能很容易理解和定制化Excel的宏了。
Excel文件的读取
通过xlrd库的open_workbook()对Excel数据进行读入。
#lrd读取并输出基本信息# -*- coding: utf-8 -*-def readExcel(fname):from xlrd import open_workbook workbook = open_workbook(fname) print('工作表数量:', workbook.nsheets) for worksheet in workbook.sheets(): #循环输出表名 print("Worksheet name:", worksheet.name, "\tRows:",worksheet.nrows, "\tColumns:", worksheet.ncols)readExcel('sales_2015.xlsx')
输出:
工作表数量: 3Worksheet name: january_2015 Rows: 7 Columns: 5Worksheet name: february_2015 Rows: 7 Columns: 5Worksheet name: march_2015 Rows: 7 Columns: 5
Excel文件的写入
写入要用到 xlwt 库,如下面的代码,创建一个Workbook对象后,通过worksheet.write()写入数据。因为使用with进行处理,所以不需要写close()显式关闭打开的文件。
#读取一些Excel并写入新表def parsingExcToWrite(in_file,out_file):from xlrd import open_workbook from xlwt import Workbook #导入一个 Workbook对象 output_workbook = Workbook() output_worksheet = output_workbook.add_sheet('jan_2015_output') #加一个新工作表到工作簿对象里 with open_workbook(in_file) as workbook: worksheet = workbook.sheet_by_name('january_2015') #引用上面创建的工作表 print('type(worksheet):',type(worksheet)) print('write()传入参数类型:',type(worksheet.cell_value)) for row_index in range(worksheet.nrows): for column_index in range(worksheet.ncols): #枚举写入数据 output_worksheet.write(row_index, column_index, worksheet.cell_value(row_index, column_index)) output_workbook.save(out_file)in_f='sales_2015.xlsx'out_f='save_sales_2015.xlsx'parsingExcToWrite(in_f,out_f) #调用
输出:
type(worksheet):
write()传入参数类型: 生成的文件效果如下:
上面写成的函数parsingExcToWrite()就是是一个可以使用在读取、处理、写入的框架,如前所说,这两个库不能直接对Excel进行修改,那么读取相应的数据处理后再写入新表就是很好的解决方案。 下面的处理代码如果需要保存处理后的数据就可以基于这段代码进行扩展。
pandas库读写Excel下面看看用pandas进行Excel读取的操作, 读只需要一句话(引入库的不算在内),pd.read_excel(in_fname),和前一篇笔记读取csv的格式一样,都是生成dataframe数据格式。写入Excel通过pd.ExcelWriter()构建一个Excel写入对象,再对这个对象操作,最后调用 .save()进行写入到硬盘。
import pandas as pd in_f='sales_2015.xlsx'out_f='save_sales_2015_1.xlsx'data_frame = pd.read_excel(in_f, 'january_2015', index_col=None) #对 data_frame进行一些处理dframe_condition = data_frame[:] writer = pd.ExcelWriter(out_f)dframe_condition.to_excel(writer, sheet_name='sheet_name',index=False) writer.save()print('done')#输出: done
筛选与统计量计算因为pandas可以简化一些操作,并且多练pandas是很有意义很重要的,所以下面筛选和统计量的计算都是基于pandas的处理。
有些时候,我们并不需要 Excel 文件中的所有行,特别是数据量很大但是我们只关心满足一定条件的数据。例如,可能只需要包含一个特定的词数值的那些行,或者只需要那些与一个具体日期相关联的行数据。这时候我们就需要进行筛选,去掉不需要的行,只保留需要的行。下面的代码演示了筛选 Sale Amount 大于 $567.00 的行。我们可以通过改变代码data_frame_value_meets_condition = data_frame[data_frame['Sale Amount'].astype(float) > 567.0] 来筛选行中的值满足某个条件的数据。#import pandas as pd #上面引入了这里就不需要重复引入,如果是独立的文件需要写上这句def valConditionExc(in_file,out_file):data_frame = pd.read_excel(in_file, 'january_2015', index_col=None) data_frame_value_meets_condition = data_frame[data_frame['Sale Amount'].astype(float) > 567.0] writer = pd.ExcelWriter(out_file) data_frame_value_meets_condition.to_excel(writer, sheet_name='jan_15_output',index=False) writer.save()#行中的值匹配于特定模式def valMatchPattern(in_file,out_file): data_frame = pd.read_excel(in_file, 'january_2015', index_col=None) df_value_matp = data_frame[data_frame['Customer Name'].str.startswith("J")] writer = pd.ExcelWriter(out_file) df_value_matp.to_excel(writer, sheet_name='jan_15_output',index=False) writer.save() print(df_value_matp)#选择满足一定条件的特定列数据def selectColByIndex(in_file,out_file): data_frame = pd.read_excel(input_file, 'january_2015', index_col=None) df_col_by_index = data_frame.iloc[:, [1, 4]] writer = pd.ExcelWriter(output_file) df_col_by_index.to_excel(writer, sheet_name='jan_15_output',index=False) writer.save()in_f='sales_2015.xlsx'valConditionExc(in_f,'save_sales_2015_2.xlsx')valMatchPattern(in_f,'save_sales_2015_3.xlsx')
输出:
Customer ID Customer Name Invoice Number Sale Amount Purchase Date0 1234 John Smith 100-0002 123 2015-01-014 5678 Jenny Walters 100-0006 345 2015-01-24
使用 pandas 基于列标题选取特定列,一种方式是在数据框名称后面的方括号中将列名以字符串方式列出。另外一种方式是使用 loc 函数。如果使用 loc 函数,那么需要在列标题列表前面加上一个冒号和一个逗号,表示你想为这些特定的列保留所有行。例如下面的代码:
#import pandas as pd def selectAllColByName(in_file,out_file):data_frame = pd.read_excel(in_file, 'january_2015', index_col=None) selected_columns = data_frame.loc[:, ['Customer ID', 'Purchase Date']] #根据列标题选取特定列 writer = pd.ExcelWriter(out_file) selected_columns.to_excel(writer, sheet_name='jan_13_output',index=False) print(selected_columns) writer.save()in_f='sales_2015.xlsx'selectAllColByName(in_f,'save_sales_2015_4.xlsx')
输出:
Customer ID Purchase Date0 1234 2015-01-011 2345 2015-01-062 3456 2015-01-113 4567 2015-01-184 5678 2015-01-245 6789 2015-01-31
大家可以根据代码的效果区分上上部分代码的data_frame.iloc[:, [1, 4]] 和上面的data_frame.loc[:,
['Customer ID', 'Purchase Date']]
.loc for label based indexing.iloc for positional indexing
数据装入pandas的dataframe之后,除了进行筛选,计算一些统计量也是数据分析很重要的工作,描述性统计给我们提供了很多描述数据的指标,下面的代码为工作表的销售数据计算总数和均值。
#import pandas as pd def getSumAndAverage(in_f):all_worksheets = pd.read_excel(in_f,sheetname=None, index_col=None) workbook_total_sales = [] workbook_number_of_sales = [] workbook_mean_sales = [] for worksheet_name, w_data in all_worksheets.items(): total_sales = pd.DataFrame([float(str(value).strip('$').replace(',','')) for value in w_data.loc[:, 'Sale Amount']]).sum() #算一个表的总体销售额 number_of_sales = len(w_data.loc[:, 'Sale Amount']) workbook_total_sales.append(total_sales) #装入一个列表 workbook_number_of_sales.append(number_of_sales) mean_sales=total_sales/number_of_sales #均值 workbook_mean_sales.append(mean_sales) print(worksheet_name,'\t total:',total_sales[0],'\t num:',number_of_sales,'\t mean:',mean_sales[0])in_f='sales_2015.xlsx'getSumAndAverage(in_f)
输出:
january_2015 total: 3201.0 num: 6 mean: 533.5february_2015 total: 55007.0 num: 6 mean: 9167.83333333march_2015 total: 246045.0 num: 6 mean: 41007.5
- ?
java怎么读取数组中的最后一个数
指流砂
展开
数组中的索引是从0开始算的,那么就简单了,直接读取(数组长度-1)处的元素就是数组中的最后一个数了,代码如下:
public class Test {
\x09public static void main(String[] args) {
\x09\x09int[] a = {1, 3, 5, 6};
\x09\x09System.out.println("数组最后一个数为: " + a[a.length - 1]);
\x09}
}(本文内容由百度知道网友liuyang054贡献)
- ?
PHPexcel读取excel数据
老杰
展开
PHPExcel是一个PHP类库,用来帮助我们简单、高效实现从Excel读取Excel的数据和导出数据到Excel。也是我们日常开发中,经常会遇到的使用场景。PHPExcel可以快速导入客户信息,避免人工录入信息的麻烦。这里分享下读取数据的过程
1. 下载PHPexcel, 我这里下载的PHPExcel-1.8
2. 将下载的文件解压缩拷贝到项目目录中,如图:
3. 准备好要读取的excel文件,如图:
4. 加载PHPexcel文件并读取数据:
5. 读取结果如下:
- ?
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处理多样性数据源之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使用Apache POI导出Excel
语柔
展开
一.POI简单介绍
Apache POI 是用Java 编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对 Microsoft Office 格式档案读和写的功能
HSSF 提供读写Microsoft Excel XLS格式档案的功能。
XSSF 提供读写Microsoft Excel OOXML XLSX格式档案的功能。
HWPF 提供读写Microsoft Word DOC格式档案的功能。
HSLF 提供读写Microsoft PowerPoint格式档案的功能。
HDGF 提供读Microsoft Visio格式档案的功能。
HPBF 提供读Microsoft Publisher格式档案的功能。
HSMF 提供读Microsoft Outlook格式档案的功能。
二.操作步骤
1.环境配置:导入jar包
org.apache.poi poi 3.16
2.创建一个Excel工作簿
@Test public void test() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel工作蒲.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); }
3.创建一个sheet页
@Test public void sheet() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //创建sheet页面 wb.createSheet("第一个sheet页"); wb.createSheet("第二个sheet页"); //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel工作蒲带有sheet页.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); }
sheet页
4.创建行和列
@Test public void row() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //创建sheet页面 Sheet sheet = wb.createSheet("学生信息sheet页"); //创建一行 Row row = sheet.createRow(0); //创建一个单元格 Cell cell =null; for(int i = 0 ;i<5;i++){ row.createCell(i).setCellValue("写入信息:单元格内容"+i); } //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel学生信息.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); }
5.创建一个时间样式到Excel
@Test public void date() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //创建sheet页面 Sheet sheet = wb.createSheet("时间sheet页"); //创建一行 Row row = sheet.createRow(0); //创建一个单元格 Cell cell = row.createCell(0); cell.setCellValue(new Date()); CreationHelper creationHelper = wb.getCreationHelper(); //设置单元格样式 CellStyle cellStyle = wb.createCellStyle(); cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("YYYY-MM-DD hh:mm:ss")); cell = row.createCell(1); cell.setCellValue(new Date()); //设置日期样式 cell.setCellStyle(cellStyle); //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel日期格式.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); }
6.单元格对其方式及行高
@Test public void style() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //创建sheet页面 Sheet sheet = wb.createSheet("第一个sheet"); //创建一行 Row row = sheet.createRow(0); //设置行高 row.setHeightInPoints(30); //创建一个单元格 createCell(wb,row,(short)0,HSSFCellStyle.ALIGN_CENTER,HSSFCellStyle.VERTICAL_BOTTOM); createCell(wb,row,(short)1,HSSFCellStyle.ALIGN_JUSTIFY,HSSFCellStyle.VERTICAL_CENTER); createCell(wb,row,(short)2,HSSFCellStyle.ALIGN_CENTER_SELECTION,HSSFCellStyle.VERTICAL_JUSTIFY); //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel样式.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); } /** * 创建一个单元格设置对应的对其方式 * @param workbook 工作蒲 * @param row 行 * @param column 列 */ private static void createCell(Workbook workbook, Row row, short column,short halign,short valign){ Cell cell = row.createCell(column);//创建单元格 cell.setCellValue(new HSSFRichTextString("我是富文本"));//设置值 CellStyle cellStyle = workbook.createCellStyle();//创建样式 cellStyle.setAlignment(halign);//设置单元格水平方向对其方式 cellStyle.setVerticalAlignment(valign);//设置单元格垂直方向对其方式 cell.setCellStyle(cellStyle); }
合并单元格
@Test public void test1() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //创建sheet页面 Sheet sheet = wb.createSheet("第一个sheet"); //创建一行 Row row = sheet.createRow(1); //设置行高 row.setHeightInPoints(30); //创建一个单元格 Cell cell = row.createCell(1); cell.setCellValue("合并单元格"); //合并单元格(起始行,结束行,起始列,结束列) sheet.addMergedRegion(new CellRangeAddress(1,2,1,2)); //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel样式.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); }
- ?
整理关于java读取excel内容的例子供大家参考
Valarie
展开
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读写
武清人
展开
前段时间在 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
-
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、快速多表合并