Excel开发文档

jxl动态导出Excel 一、概述 在工作过程中,都会遇到这样一个需求,动态选择想要导出的字段,这里写成通用的导出Excel的工具。 二、项目实现 1、构建pom.xml 我的工程是利用Maven来构建的,这里仅给出最核心的包 <!--jxi导出--> <dependency> <groupId>net.sourceforge.jexcelapi</gro... 阅读详情
 Excel开发文档
1 开发调研
1.1 需求描述
MS的电子表格(Excel)是Office的重要成员,是保存统计数据的一种常用格式。作为办公文档,势必要涉及到的电子文档的交换,Excel是一种在企业中非常通用的文件格式,打印和管理也比较方便。在一个Java应用中,将一部分数据生成Excel格式,是与其他系统无缝连接的重要手段。
1.2 Excel开发常用开源工具
在开源世界中,有两套比较有影响的API可供使用,一个是POI,一个是jExcelAPI。
1.3 比较开源工具的优缺点
1.3.1 Jxl优缺点
Jxl特征有如下描述: 
● 支持Excel 95-2000的所有版本 
● 生成Excel 2000标准格式 
● 支持字体、数字、日期操作 
● 能够修饰单元格属性 
● 支持图像和图表 
应该说以上功能已经能够大致满足我们的需要。最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。
1.3.2 Poi优缺点
Jakarta 的 POI Project 与 Java Excel API 在开源世界中可以说是并驾齐驱,但是也各有优劣,poi在某些细节有些小Bug并且不支持写入图片(poi其实可以写入图片,不过没有jxl来的方便,比较麻烦),其他方面都挺不错的;而JXL提供了对图片的支持(但是仅仅支持png格式的图片),问题就是对公式支持不是很好,但还是提供了简单的公式读取支持。因此你的项目中要选用什么样的第三方插件为完全由你的应用来决定。如果你的软件是跟财务有相当的关系的话,建议采用 POI Project,就我所在目前的项目来说由于用不到计算公式,而且很可能需要导出图片,因此,我的选择是 JXL 。

1.4 性能比较以及最终选择
1.4.1 内存消耗:(来自网络)
谈下JVM虚拟机内存消耗的情况.
数据量3000条数据,每条60列.JVM虚拟机内存大小64M.
使用POI:运行到2800条左右就报内存溢出.
使用JXL:3000条全部出来,并且内存还有21M的空间.
可想而知,在对内存的消耗方面差距还是挺大的.
也许是由于JXL在对资源回收利用方面做的还挺不错的。
1.4.2 速度效率(读取excel数据)(来自网络)
文件 POI加载耗时 POI总耗时 JXL加载耗时 Jxl总耗时 
文件大小57KB 1172 ms 1172 ms 1265 ms 2250 ms 
文件大小652KB 2297 ms 2313 ms 4406 ms 9750 ms 
文件大小2.24M 3109ms 3140ms 16313ms 37453ms

1.4.3 写excel速度效率
jxl插入数据比poi速度要快
1.4.4 功能对比
相比提供的功能的话,JXL相对弱了点.所以如果要实现的功能比较复杂的情况下可以考虑使用POI,但如果只想生成一些大数据量可以考虑使用JXL,或者CSV也是一个不错的选择,不过CSV并不是真正的excel,然而jxl插入数据比poi速度要快。

2 Jxl开发指南
2.1 介绍
jxl操作excel包括对象Workbook,Sheet ,Cell。
一个excel就对应一个Workbook对象,
一个Workbook可以有多个Sheet对象
一个Sheet对象可以有多个Cell对象
2.2 读取excel操作
通过Workbook,Sheet ,Cell这三个对象我们就可以实现Excel文件的读取工作。我们先想想一下读取步骤,不管是什么样的Excel操作框架必定都要经历
1、 选取Excel文件得到工作薄
2、 选择工作表
3、 选择Cell
4、 读取信息
2.2.1 读取工作薄
选取Excel文件得到工作薄Workbook
Workbook workbook = Workbook.getWorkbook(new File("myfile.xls"));
2.2.2 读取工作表
通过Workbook的getSheet方法选择第一个工作表(从0开始)
Sheet sheet = workbook.getSheet(0);
也可以通过工作的名称来得到Sheet
2.2.3 读取单元格
通过Sheet的getCell方法选择位置为C2的单元格(两个参数都从0开始)
Cell c2 = sheet.getCell(2,1);

2.2.3.1 读取单元格的值
2.2.3.2 通过Cell的getContents方法
把单元格中的信息以字符的形式读取出来String stringc2 = c2.getContents();
2.2.3.3 Cell提供了一个getType方法
能够返回单元格的类型信息,同时JXL提供了一个CellType类用来预设Excel中的类型信息,而且JXL提供了一些Cell类的子类用来分别用来表示各种类型的单元格,如LabelCell,NumberCell,DateCell分别表示字符、数值、日期类型的单元格
if (c2.getType() == CellType. LABEL) 
{ 
LabelCell nc = (LabelCell) c2; 
String number b2 = nc. getString();
}
if (c2.getType() == CellType. DATE) 
{ 
DateCell nc = (DateCell) c2; 
Date number b2 = nc. getDate();
}

if (c2.getType() == CellType.NUMBER) 
{ 
NumberCell nc = (NumberCell) c2; 
double number b2 = nc.getValue();
}
API提供了以下基本类型,与Excel的数据格式相对应,如下图所示

2.2.4 以释放资源:workbook.close()
当你完成对Excel电子表格数据的处理后,一定要使用close()方法来关闭先前创建的对象,以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要
最后不要忘记关闭workbook以释放资源:workbook.close();
2.3 写excel操作
通过WritableWorkbook,WritableSheet,Label这三个对象我们就可以实现Excel文件的插入工作。我们先想想一下插入,不管是什么样的Excel操作框架必定都要经历
1、 创建Exce工作薄
2、 创建工作表
3、 创建单元格

2.3.1 创建工作薄
API提供了两种方式来处理可写入的输出流,一种是直接生成本地文件,如果文件名不带全路径的话,缺省的文件会定位在当前目录,如果文件名带有全路径的话,则生成的Excel文件则会定位在相应的目录;另外一种是将Excel对象直接写入到输出流,例如:用户通过浏览器来访问Web服务器,如果HTTP头设置正确的话,浏览器自动调用客户端的Excel应用程序,来显示动态生成的Excel电子表格。
2.3.1.1 创建可写入的Excel工作薄
WritableWorkbook 
wwb = Workbook.createWorkbook(new File(targetfile));
2.3.1.2 将WritableWorkbook直接写入到输出流
OutputStream os = new FileOutputStream(targetfile);
WritableWorkbook wwb = Workbook.createWorkbook(os);
2.3.2 创建工作表
WritableSheet ws = wwb.createSheet("通讯录", 0);//创建sheet
2.3.3 创建单元格
2.3.3.1 添加文本类单元格
Label labelC = new Label(0, 0, "This is a Label cell");
2.3.3.2 添加带有字型Formatting的对象
WritableFont wf = new WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
WritableCellFormat wcfF = new WritableCellFormat(wf);
labelCF = new Label(1, 0, "This is a Label Cell", wcfF);
ws.addCell(labelCF);
2.3.3.3 添加带有字体颜色Formatting的对象
WritableFont wfc = new WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD, false,
UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);
WritableCellFormat wcfFC = new WritableCellFormat(wfc);
Label labelCFC = new Label(1, 0, "This is a Label Cell", wcfFC);
ws.addCell(labelCF);
2.3.3.4 添加Number对象
Number labelN = new jxl.write.Number(0, 1, 3.1415926);
ws.addCell(labelN);
2.3.3.5 添加带有formatting的Number对象
NumberFormat nf = new NumberFormat("#.##");
WritableCellFormat wcfN = new WritableCellFormat(nf);
Number labelNF = new Number(1, 1, 3.1415926, wcfN);
ws.addCell(labelNF);
2.3.3.6 添加Boolean对象
Boolean labelB = new jxl.write.Boolean(0, 2, false);
ws.addCell(labelB);
2.3.3.7 添加DateTime对象
DateTime labelDT = new DateTime(0, 3, new java.util.Date());
ws.addCell(labelDT);
2.3.3.8 添加带有formatting的DateFormat对象
DateFormat df = new DateFormat("dd MM yyyy hh:mm:ss");
WritableCellFormat wcfDF = new WritableCellFormat(df);
DateTime labelDTF = new DateTime(1, 3, new Date(), wcfDF);
ws.addCell(labelDTF);
2.3.3.9 添加公式单元格
Fornual formual = new Formual(0,11,”Sum(A1:A9)”);
wrb.addCell(formual);
2.3.3.10 添加图像
WritableImage wrimage=new WritableImage(1,5,10,10,new File(imageFilepath));
wrb.addImage(wrimage); 
注意,API中注明只支持png文件。
2.3.4 合并单元格
通过writablesheet.mergeCells(int x,int y,int m,int n);来实现的。
表示将从第x+1列,y+1行到m+1列,n+1行合并 (四个点定义了两个坐标,左上角和右下角)结果是合并了m-x+1行,n-y+1列,两者乘积就是合并的单元格数量。
sheet.mergeCells(0, 6, 3, 8);
label = new Label(0, 6, "合并了12个单元格");
sheet.addCell(label);

2.3.5 添加单元格样式
主要是改变单元格背景、字体、颜色等等。
WritableCellFormat wc = new WritableCellFormat();
wc.setAlignment(Alignment.CENTRE); // 设置居中
wc.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框线
wc.setBackground(jxl.format.Colour.RED); // 设置单元格的背景颜色
label = new Label(1, 5, "字体", wc);
sheet.addCell(label);
2.3.6 设置单元格字体
WritableFont wfont = 
new WritableFont(WritableFont.createFont("楷书"), 20);
WritableCellFormat font = new WritableCellFormat(wfont);
label = new Label(2, 6, "楷书", font);
sheet.addCell(label);
2.3.7 写入到文件
wwb.write();// 写入数据
wwb.close();// 关闭文件

2.4 拷贝、更新Excel工作薄
//创建只读的Excel工作薄的对象
jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(sourcefile));
//创建可写入的Excel工作薄对象
WritableWorkbook wwb=Workbook.createWorkbook(new File(targetfile), rw);
//读取第一张工作表
jxl.write.WritableSheet ws = wwb.getSheet(0);
//获得第一个单元格对象
jxl.write.WritableCell wc = ws.getWritableCell(0, 0);
//判断单元格的类型, 做出相应的转化
if(wc.getType() == CellType.LABEL)
{
Label l = (Label)wc;
l.setString("The value has been modified.");
}
//写入Excel对象
wwb.write();
//关闭可写入的Excel对象
wwb.close();
//关闭只读的Excel对象
rw.close();
为了提高性能,在读取工作表时,与数据相关的一些输出信息,所有的格式信息,如:字体、颜色等等,是不被处理的,因为我们的目的是获得行数据的值,既使没有了修饰,也不会对行数据的值产生什么影响。唯一的不利之处就是,在内存中会同时保存两个同样的工作表,这样当工作表体积比较大时,会占用相当大的内存,但现在好像内存的大小并不是什么关键因素了。
一旦获得了可写入的工作表对象,我们就可以对单元格对象进行更新的操作了,在这里我们不必调用API提供的add()方法,因为单元格已经于工作表当中,所以我们只需要调用相应的setXXX()方法,就可以完成更新的操作了。
尽单元格原有的格式化修饰是不能去掉的,我们还是可以将新的单元格修饰加上去,以使单元格的内容以不同的形式表现。
新生成的工作表对象是可写入的,我们除了更新原有的单元格外,还可以添加新的单元格到工作表中。
最后,不要忘记调用write()方法,将更新的内容写入到文件中,然后关闭工作薄对象,这里有两个工作薄对象要关闭,一个是只读的,另外一个是可写入的。

3 JXL读写excel文件的例子 (来自网络)
3.1 实例一 
import java.io.FileOutputStream; 
import java.io.OutputStream; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 
import jxl.*; 
import jxl.format.Alignment; 
import jxl.format.Border; 
import jxl.format.BorderLineStyle; 
import jxl.format.CellFormat; 
import jxl.write.Boolean; 
import jxl.write.Label; 
import jxl.write.Number; 
import jxl.write.WritableCellFormat; 
import jxl.write.WritableFont; 
import jxl.write.WritableSheet; 
import jxl.write.WritableWorkbook; 
public class JXLExample { 

/** 
* 
* @author smart * 
*/ 
public static void main(String[] args) { 
// 准备设置excel工作表的标题 
String[] title = {"编号","产品名称","产品价格","产品数量","生产日期","产地","是否出口"}; 
try { 
// 获得开始时间 
long start = System.currentTimeMillis(); 
// 输出的excel的路径 
String filePath = "c:\\test.xls"; 
// 创建Excel工作薄 
WritableWorkbook wwb; 
// 新建立一个jxl文件,即在C盘下生成test.xls 
OutputStream os = new FileOutputStream(filePath); 
wwb=Workbook.createWorkbook(os); 
// 添加第一个工作表并设置第一个Sheet的名字 
WritableSheet sheet = wwb.createSheet("产品清单", 0); 
Label label; 
for(int i=0;i<title.length;i++){ 
label = new Label(i,0,title[i]); 
// 将定义好的单元格添加到工作表中 
sheet.addCell(label); 
} 
/* 
* 保存数字到单元格,需要使用jxl.write.Number 
* 必须使用其完整路径,否则会出现错误 
* */ 
// 填充产品编号 
jxl.write.Number number = new jxl.write.Number(0,1,20071001); 
sheet.addCell(number); 
// 填充产品名称 
label = new Label(1,1,"金鸽瓜子"); 
sheet.addCell(label); 
/* 
* 定义对于显示金额的公共格式 
* jxl会自动实现四舍五入 
* 例如 2.456会被格式化为2.46,2.454会被格式化为2.45 
* */ 
jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##"); 
jxl.write.WritableCellFormat wcf = new jxl.write.WritableCellFormat(nf); 
// 填充产品价格 
jxl.write.Number nb = new jxl.write.Number(2,1,2.45,wcf); 
sheet.addCell(nb); 
// 填充产品数量 
jxl.write.Number numb = new jxl.write.Number(3,1,200); 
sheet.addCell(numb); 
/* 
* 定义显示日期的公共格式 
* 如:yyyy-MM-dd hh:mm 
* */ 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
String newdate = sdf.format(new Date()); 
// 填充出产日期 
label = new Label(4,1,newdate); 
sheet.addCell(label); 
// 填充产地 
label = new Label(5,1,"陕西西安"); 
sheet.addCell(label); 
/* 
* 显示布尔值 
* */ 
jxl.write.Boolean bool = new jxl.write.Boolean(6,1,true); 
sheet.addCell(bool); 
/* 
* 合并单元格 
* 通过writablesheet.mergeCells(int x,int y,int m,int n);来实现的 
* 表示将从第x+1列,y+1行到m+1列,n+1行合并 
* 
* */ 
sheet.mergeCells(0,3,2,3); 
label = new Label(0,3,"合并了三个单元格"); 
sheet.addCell(label); 
/* 
* 
* 定义公共字体格式 
* 通过获取一个字体的样式来作为模板 
* 首先通过web.getSheet(0)获得第一个sheet 
* 然后取得第一个sheet的第二列,第一行也就是"产品名称"的字体 
* */ 
CellFormat cf = wwb.getSheet(0).getCell(1, 0).getCellFormat(); 
WritableCellFormat wc = new WritableCellFormat(); 
// 设置居中 
wc.setAlignment(Alignment.CENTRE); 
// 设置边框线 
wc.setBorder(Border.ALL, BorderLineStyle.THIN); 
// 设置单元格的背景颜色 
wc.setBackground(jxl.format.Colour.RED); 
label = new Label(1,5,"字体",wc); 
sheet.addCell(label); 
// 设置字体 
WritableFont wfont=new WritableFont(WritableFont.createFont("隶书"),20); 
WritableCellFormat font = new WritableCellFormat(wfont); 
label = new Label(2,6,"隶书",font); 
sheet.addCell(label); 
// 写入数据 
wwb.write(); 
// 关闭文件 
wwb.close(); 
long end = System.currentTimeMillis(); 
System.out.println("----完成该操作共用的时间是:"+(end-start)/1000); 
} catch (Exception e) { 
System.out.println("---出现异常---"); 
e.printStackTrace(); 
} 
} 

} 
3.2 实例二

package com.test;
import java.io.File;
import java.io.IOException;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

public class JexcelSample {
/**
* 写excel文件
*
*/
public void writeExc(File filename){
WritableWorkbook wwb = null;
try 
{ 
wwb = Workbook.createWorkbook(filename); 
}
catch (Exception e){ 
e.printStackTrace(); 
} 

//创建Excel工作表 
WritableSheet ws = wwb.createSheet("通讯录", 0);//创建sheet
try {
ws.mergeCells(0, 0, 2, 1);//合并单元格(左列,左行,右列,右行)从第1行第1列到第2行第3列
Label header = new Label(0, 0, "通讯录(191026班)", getHeader()); 
ws.addCell(header);//写入头
Label l = new Label(0, 2, "姓名", getTitle());//第3行
ws.addCell(l);
l = new Label(1, 2, "电话", getTitle());
ws.addCell(l);
l = new Label(2, 2, "地址", getTitle());
ws.addCell(l);
l = new Label(0, 3, "小祝", getNormolCell());//第4行
ws.addCell(l);
l = new Label(1, 3, "1314***0974", getNormolCell());
ws.addCell(l);
l = new Label(2, 3, "武汉武昌", getNormolCell());
ws.addCell(l);
l = new Label(0, 4, "小施", getNormolCell());//第5行
ws.addCell(l);
l = new Label(1, 4, "1347***5057", getNormolCell());
ws.addCell(l);
l = new Label(2, 4, "武汉武昌", getNormolCell());
ws.addCell(l);
ws.setColumnView(0,20);//设置列宽
ws.setColumnView(1,20);
ws.setColumnView(2,40);
ws.setRowView(0,400);//设置行高
ws.setRowView(1,400);
ws.setRowView(2,500);
ws.setRowView(3,500);
ws.setRowView(4,500);
} catch (RowsExceededException e1) {
e1.printStackTrace();
} catch (WriteException e1) {
e1.printStackTrace();
}

//输出流
try {
wwb.write();
} catch (IOException ex) {
// TODO 自动生成 catch 块
ex.printStackTrace();
}
//关闭流
try {
wwb.close();
} catch (WriteException ex) {
// TODO 自动生成 catch 块
ex.printStackTrace();
} catch (IOException ex) {
// TODO 自动生成 catch 块
ex.printStackTrace();
}
//outStream.close();
System.out.println("写入成功!\n");
}

public void readExc(File filename) throws BiffException, IOException{
Workbook wb = Workbook.getWorkbook(filename);
Sheet s = wb.getSheet(0);//第1个sheet
Cell c = null;
int row = s.getRows();//总行数
int col = s.getColumns();//总列数
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
c = s.getCell(j,i);
System.out.print(c.getContents()+" ");
}
System.out.println();
} 
}

/**
* 设置头的样式
* @return 
*/
public static WritableCellFormat getHeader(){
WritableFont font = new WritableFont(WritableFont.TIMES, 24 ,WritableFont.BOLD);//定义字体
try {
font.setColour(Colour.BLUE);//蓝色字体
} catch (WriteException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
}
WritableCellFormat format = new WritableCellFormat(font);
try {
format.setAlignment(jxl.format.Alignment.CENTRE);//左右居中
format.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);//上下居中
format.setBorder(Border.ALL,BorderLineStyle.THIN,Colour.BLACK);//黑色边框
format.setBackground(Colour.YELLOW);//黄色背景
} catch (WriteException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
return format;
}

/**
* 设置标题样式
* @return
*/
public static WritableCellFormat getTitle(){
WritableFont font = new WritableFont(WritableFont.TIMES, 14);
try {
font.setColour(Colour.BLUE);//蓝色字体
} catch (WriteException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
}
WritableCellFormat format = new WritableCellFormat(font);

try {
format.setAlignment(jxl.format.Alignment.CENTRE);
format.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
format.setBorder(Border.ALL,BorderLineStyle.THIN,Colour.BLACK);
} catch (WriteException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
return format;
}

/**
* 设置其他单元格样式
* @return
*/
public static WritableCellFormat getNormolCell(){//12号字体,上下左右居中,带黑色边框
WritableFont font = new WritableFont(WritableFont.TIMES, 12);
WritableCellFormat format = new WritableCellFormat(font);
try {
format.setAlignment(jxl.format.Alignment.CENTRE);
format.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
format.setBorder(Border.ALL,BorderLineStyle.THIN,Colour.BLACK);
} catch (WriteException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
return format;
}

public static void main(String[] args) throws IOException, BiffException{
JexcelSample js = new JexcelSample();
File f = new File("D:\\address.xls");
f.createNewFile();
js.writeExc(f);
js.readExc(f);
}
}
生成的excel表格如下:


4 jxl常用api
4.1.1 1、Workbook类提供的方法
int getNumberOfSheets() 获取工作表的总个数
Sheet[] getSheets() 获取数组型的工作表
Sheet getSheet(String name);//得到此对应名称的工作表
4.1.2 2、Sheet接口提供的方法
String getName() 获取工作表的名称
int getColumns() 获取Sheet表中所包含的总列数
Cell[] getColumn(int column) 获取某一列的所有单元格,
返回的是单元格对象数组
int getRows() 获取Sheet表中所包含的总行数
Cell[] getRow(int row) 获取某一行的所有单元格,返回的是单元格对象数组
Cell getCell(int column, int row)获取指定单元格的对象引用,需要注意的是它的两个参数,第一个是列数,第二个是行数,这与通常的行、列组合有些不同
WritableSheet.setRowView(int i,int height); 指定第i+1行的高度
WritableSheet.setColumnView(int i,int width); 指定第i+1列的宽度
桌面运维-打印机驱动批量自动安装 基于内网文件服务器与Windows批处理实现自动化批量安装网络打印机驱动 阅读详情

相关推荐

手把手教你用静态IP解决PDA与打印机连接不稳定问题

本文详细介绍了如何通过配置静态IP解决PDA与打印机连接不稳定的问题。从动态IP与静态IP的对比分析入手,提供了路由器、PDA和打印机的具体配置步骤,并分享了企业级部署的进阶技巧和运维监控方案,帮助用户彻底解决设备断连难题,提升工作效率。

weixin_29251131的博客 141

JAVA 处理 Excel 的两种常见方法 —— JXL(Workbook)和 POI(HSSFWorkbook、XSSFWorkbook)

(1)HSSFWorkbook 介绍HSSFWorkbook 是操作Excel2003以前(包括2003)的版本,扩展名是.xls(2)常用组件HSSFWorkbook excel的文档对象HSSFSheet excel的表单HSSFRow excel的行HSSFCell excel的格子单元HSSFFont excel字体HSSFDataFormat 日期格式HSSFHeader sheet头HSSFFooter sheet尾(只有打印的时候才能看到效果)(3)样式。

空名先生 3969

【bat】做个一键连接网络打印机的bat

用bat做个一键连接网络打印机 用途:大部分普通用户来说,并不知道怎么连接网络打印机(共享打印机还好) 好处:用户只需双击bat,输入打印机的IP地址敲下回车即可连接(当然你也可以改成一键连接), 优势:相比点击驱动包的setup还要简单几倍,成功率也高(因为驱动安装包会不能搜索出不同网段的打印机,虽然是网络互通) 代码示例的型号是富士施乐的4475,请读者根据实际情况安装合适的驱动 第三部分,请...

laoxige的博客 1万+

(转)jxl使用指南

1 从Excel文件读取数据表   Java Excel API既可以从本地文件系统的一个文件(.xls),也可以从输入流中读取Excel数据表。读取Excel数据表的第一步是创建Workbook(术 语:工作薄),下面的代码片段举例说明了应该如何操作:(完整代码见ExcelReading.java) import java.io.*; import jxl...

Done 472

爱普生打印机IP地址查询全攻略:解决打印机离线与网络打印难题

在局域网办公与家庭共享场景中,网络打印的稳定性高度依赖设备的IP地址。IP地址如同网络设备的门牌号,由路由器通过DHCP动态分配,一旦因重启、断连或信号波动而变更,电脑和手机便无法准确找到打印机,导致“打印机离线”“找不到设备”“打印任务排队”等常见故障。理解IP地址的分配原理,掌握查询与固定IP的方法,是网络打印排障的技术价值所在。实际操作中,可通过打印机面板、网络状态页、电脑驱动端口、路由器后台、手机App(如Epson Smart Panel)及命令行等多元路径确认当前地址,并结合MAC地址绑定设置静

weixin_33904756的博客 441

java连接打印机_JAVA连接打印机详解(有驱动,无驱动两种方式)

java连接打印机打印pdf文件,网上搜索了一大把资料,基本上都是重复。。。下面骂人的一大堆。。我这里来解决一下。需求:前端调用用接口 后端根据模版生成数据联通打印机直接一键打印!思路:这里讲一下打印最好使用pdf去打印。不管是word.excel 都是通过转PDF 再打印出来的。所以我这里的思路就是 选择模版生成文件,并且打印。我这里选择html模版 也就是freemark模版。1、通过vm文件...

weixin_33331559的博客 7556

用银河麒麟 LiveCD 快速查看原系统 IP 和打印机配置

当系统崩溃无法启动时,使用银河麒麟的 LiveCD 或试用镜像,仍然可以通过终端工具查看原系统的 IP 地址和打印机配置。Hello,大家好啊!今天给大家带来一篇在银河麒麟操作系统的 LiveCD 或系统试用镜像环境下,如何查看原系统中电脑的 IP 地址与网络打印机 IP 地址的实用教程。在系统损坏或不可登录的场景中,这种操作非常关键,特别适合用于故障应急排查、快速迁移打印配置或网络环境还原!此时我们不能直接使用桌面工具查看设置,而要通过终端命令“挂载原系统”并进入 chroot 环境,手动查看配置文件。

鹏大圣运维 5032

Win11网络打印机IP直连指南:从端口测试到故障排查

网络打印是办公场景中的常见需求,而打印机连接方式的选择直接影响打印的稳定性与效率。通过TCP/IP协议以IP地址直连打印机,可以绕开Windows自动发现机制,有效解决网络打印机搜不到、连接失败等问题。掌握端口连通性测试、驱动安装、RAW/WSD端口选择等基础原理,能帮助用户快速定位故障。在Win11环境下,经常会遇到0x0000709等错误,通过排查打印池服务、驱动兼容性及端口绑定即可修复。结合多种实际案例,分享IP直连添加打印机的完整路径与常见报错处理。

weixin_33178839的博客 273

如何连接共享打印机 4种方法一步到位

本文详细介绍如何连接共享打印机的4种方法,包括自动搜索、IP连接、主机名连接及工具修复,适合Win10/Win11用户快速上手解决打印机共享问题。

weixin_56386428的博客 3851

jxlAPI(jxl完整的API)

jxl........API look look

JXL官方文档

JXL官方文档,jxl英文版api

在运维工作中,打印机故障是常见的问题之一。以下是一些常见的打印机故障及其解决方法:

桌面运维,打印机故障故障排除

cmdnet1的博客 2749

【文章阅读+代码复现】Point-GNN

Brief 在3D点云语义分割方法中,GNN已经做了很多可用的方案,但是在目标检测上依旧是采用比较传统的CNN和稀疏卷积的组合,这一篇文章是研究了图卷积在3D检测的中的用法。来自卡内基梅隆大学。已经被CVPR2020接收. 这里是 paper 这里是 code Abstruct 一个采用GNN设计的3D目标检测框架 过程是先将点云场景编码成图结构,随后设计了一个叫point-GNN的网络结构,在...

有所为,有所成长 1万+

运维知识讲解之打印机连接以及电脑局域网共享打印机

打印机局域网连接共享

night__wind的博客 3868

蓝桥杯算法:打印图形——六芒星

【输入格式】 输入一行包含一个整数 n。 【输出格式】 输出一个六芒星,表示满足题意的图形。 【样例输入】 3 4 【样例输出】 【评测用例规模与约定】 对于所有评测用例,1 ≤ n ≤ 20。 总结: 第一次做图形题,做了蛮久,图形题有很多的方式去完成,它考验的是你能不能找到更简单的那一种方式. 我初看到这个图形,第一种想法是把这个六芒星当做六个小三角形来做,然后以某种规则排列一下,就能做出来,但是尝试了一下感觉太麻烦了。 然后我的第二种想法是,这个图形是对称图形,怎么能写出一半吗? 这样另一半想办

KeepCodeing 3843

如何运用好DeepSeek为自己服务:智能增强的范式革命 || 目录

1.1 认知增强的三次浪潮1.2 DeepSeek认知增强模型1.3 人机认知耦合协议1.4 认知增强的数学基础。

𝓓𝓸𝓶𝓲𝓷𝓪𝓽𝓲𝓷𝓰 𝓐𝓵𝓵 𝓣𝓱𝓲𝓷𝓰𝓼 1226

桌面运维类面试非技术问题

针对企业来讲,视频会议为企业减少了出差成本费,提升了职工工作效能,便捷了与朋友,合作方和顾客中间的沟通和互动交流,进而改进了沟通从而减少了新项目時间。如你遇到了游戏卡顿,可以使用Windows10自带的GPU加速功能尝试解决,点【开始】,选择【设置】→【显示】→【图形设置】,在此界面开启【硬件加速GPU计划】,然后选择相应的游戏,最后在【图形首选项】中选择高性能保存即可。桌面运维行业具有广阔的就业前景。另一方面,由于数字化办公的普及,企业和机构的计算机系统规模越来越大,对桌面运维专业人员的需求也越来越高。

m0_62207482的博客 6164

SECS/GSM 测试工具 SecsExpress 的配置与实战应用

本文详细介绍了半导体设备通讯测试工具SecsExpress的配置与实战应用。作为专业的SECS/GSM协议调试工具,它能模拟Host与设备端进行双向测试,帮助工程师快速部署、验证通讯链路,并高效排查与RMS系统或真实设备间的联调问题,是提升半导体工厂设备集成与维护效率的利器。

yhn456789的博客 299

打印机各种问题总结

文章目录公司打印机以及扫描仪问题总结问题解决方式一:问题解决方式二:iso系统装打印机扫描仪问题,分为俩种 公司打印机以及扫描仪问题总结 第一公司打印机添加不上,或者是不知道怎么弄打印机? 问题解决方式一: 先查看打印机的ip地址是多少,直接ip添加打印机 第一步 2 3 4 5 6 7 8 这样就可以了,我们公司用的打印机是 DELI的,你可以打电话查看你的打印机商家,让人教你维修 问题解决方式二: 可能是驱动问题,打印机一使用就是优先使用老驱动,先卸载打印机 找到你们打印机是哪个厂商的,

mingqing的博客 409

扩增子测序|iCAMP包——基于系统发育零模型分析确定性和随机性在群落构建过程R中实践

iCAMP的核心功能是通过系统发育分箱的零模型分析,量化不同生态过程的相对重要性。,用于评估不同生态过程(同质选择、异质选择、扩散和漂变)对整个群落及各个系统发育分箱(bin)的相对重要性。该方法也成为nature,science系列文章的常客,深受大家喜欢,在文章中运用该方法将为论文增色不少。外环和内环的圆环图显示了每个门(或变形菌门的分类)中不同过程的相对重要性。中央是系统发育树,内环展示了不同过程的相对重要性,表示每个系统发育箱中的DL。示例代码中提供了数据和代码,已经小编测试,可直接运行。

weixin_46814750的博客 6244

在 Windows 11 下运行 OminiParse V2,详细教程【含问题解决细节】

OmniParser V2 是微软推出的 GUI 智能体解析工具,可将屏幕截图转换为结构化元素,帮助 LLM 理解和操作界面。它在检测小图标和推理速度上显著提升,延迟降低 60%,并支持多种 LLM。

简简单单Onlinezuozuo 1092

【如何在电脑查看已连接打印机的ip地址】

本文介绍了查看打印机IP地址的方法:首先进入系统设置,选择"蓝牙和其他设备"中的"打印机和扫描仪"选项;然后选择目标打印机设备,进入其属性设置;最后在端口选项中查看TCP/IP端口信息,即可获取打印机的IP地址。以FUJIXEROX DocuCentre打印机为例,其IP地址显示为192.168.1.190。该方法适用于Windows系统下快速查找网络打印机的IP地址信息。

Leap__frog的博客 815

openwrt之luci通信原理(一)

从模板中分离,每个LuCI2子页面也需要一个定义并存放在/www/luci2/view/目录下的一个视图,视图是使用了子页面特定对象的L.ui.view扩展的JavaScript文件。有一点需要注意的是需要提供execute方法,创建视图失败有几种原因,特别是当它需要ubus加载额外的数据使用的时候。所以在execute方法中提供成功或者失败的信息是有意义的。不幸的是在异步方法加载特定数据的时候,不能简单的返回true或false,解决的方法是返回一个Promise对象来运行推迟提供是否成功的信息。

1150

电脑如何查看打印机IP地址?三种方法详解与实战避坑指南

在局域网办公环境中,网络设备的IP地址是通信的基础。打印机作为长期在线的服务型设备,其IP地址的获取与固定是保障稳定打印的关键。通过系统配置、命令行工具或路由器后台,可以从不同层面定位设备地址,理解其原理有助于快速排查脱机、网段变更等常见故障。掌握Win+R、cmd、ipconfig等基础操作,不仅能高效获取打印机IP,还能提升整体网络问题诊断能力。本文围绕打印机IP地址的查看与固定,系统梳理三种实用方法及其适用场景。

weixin_29973493的博客 352

秋招突击——笔试整理——8/25——拼多多笔试整理

继续加油! 转变思维,有简单到复杂,由直观到抽象,这种贪心模拟的题目一直是这样的!

Blackoutdragon的博客 2402

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

网络工程师必备【桌面运维指南】

网络工程师在很多公司还要负责桌面运维的工作,这类工作虽然略显枯燥,但却是保障公司员工日常办公的重要支撑,本文将为大家总结日常办公、桌面运维中高频出现的故障和处理方法。

HXKF123的博客 3560

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: 字符、字节与编码
下一篇: 将web工程打包war和解包war
java_ganbin
博客等级 码龄16年 3粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值