中企动力 > 商学院 > java打开excel
  • ?

    Java程序员必备的11大Intellij插件

    光荣

    展开

    善用Intellij插件可大幅提升我们的效率

    以下是我用过不错的Intellij插件

    1. .ignore

    地址:https://plugins.jetbrains/plugin/7495--ignore

    生成各种ignore文件,一键创建git ignore文件的模板,免得自己去写

    截图:

    2. lombok

    地址:https://plugins.jetbrains/plugin/6317-lombok-plugin

    支持lombok的各种注解,从此不用写getter setter这些 可以把注解还原为原本的java代码 非常方便

    截图:

    3. p3c

    地址:https://plugins.jetbrains/plugin/10046-alibaba-java-coding-guidelines

    阿里巴巴出品的java代码规范插件

    可以扫描整个项目 找到不规范的地方 并且大部分可以自动修复

    更多可看: https://github/alibaba/p3c/tree/master/idea-plugin

    4. FindBugs-IDEA

    地址:https://plugins.jetbrains/plugin/3847-findbugs-idea

    检测代码中可能的bug及不规范的位置,检测的模式相比p3c更多,

    写完代码后检测下 避免低级bug,强烈建议用一下,一不小心就发现很多老代码的bug

    截图:

    5. GsonFormat

    地址:https://plugins.jetbrains/plugin/7654-gsonformat

    一键根据json文本生成java类 非常方便

    截图:

    6. Maven Helper

    地址:https://plugins.jetbrains/plugin/7179-maven-helper

    一键查看maven依赖,查看冲突的依赖,一键进行exclude依赖

    对于大型项目 非常方便

    截图:

    7. VisualVM Launcher

    地址:https://plugins.jetbrains/plugin/7115-visualvm-launcher

    运行java程序的时候启动visualvm,方便查看jvm的情况 比如堆内存大小的分配

    某个对象占用了多大的内存,jvm调优必备工具

    截图:

    8. GenerateAllSetter

    地址:https://plugins.jetbrains/plugin/9360-generateallsetter

    一键调用一个对象的所有set方法并且赋予默认值 在对象字段多的时候非常方便

    截图:

    9. MyBatisCodeHelperPro

    地址:https://plugins.jetbrains/plugin/9837-mybatiscodehelperpro

    mybatis代码自动生成插件,大部分单表操作的代码可自动生成 减少重复劳动 大幅提升效率

    截图:

    10. Rainbow Brackets

    地址:https://plugins.jetbrains/plugin/10080-rainbow-brackets

    彩虹颜色的括号 看着很舒服 敲代码效率变高

    截图:

    11. Translation

    地址:https://plugins.jetbrains/plugin/8579-translation

    最好用的翻译插件,功能很强大,界面很漂亮

    以上插件均可在Intellij 插件市场中搜索到或者打开插件名字下方的链接从硬盘安装插件。

    详细的可以看p3c插件的安装文档:https://github/alibaba/p3c/tree/master/idea-plugin

    如果大家喜欢这篇文章的话,希望大家能够收藏,转发 谢谢!更多相关资讯可以关注西安华美校区,免费获得java零基础教程!额外附送excel教程!

  • ?

    Java注解解析-运行时注解详解(RUNTIME)

    Mo

    展开

    一 注解的定义

    注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明 。如果要对于元数据的作用进行分类,还没有明确的定义,不过我们可以根据它所起的作用,注解不会改变编译器的编译方式,也不会改变虚拟机指令执行的顺序,它更可以理解为是一种特殊的注释,本身不会起到任何作用,需要工具方法或者编译器本身读取注解的内容继而控制进行某种操作。大致可分为三类:

    编写文档:通过代码里标识的元数据生成文档。

    代码分析:通过代码里标识的元数据对代码进行分析。

    编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。

    二 用途

    因为注解可以再代码编译期间帮我们完成一些复杂的准备工作,所以我们可以利用注解去完成我们的一些准备工作。比如Greendao,我们注解一个实体类,它要处理成好多逻辑关系类,这些逻辑类让我们自己去书写的话那将是一个庞大的代码量, extends AbstractDao等这些类。比如BufferKnife,我们用注解将控件的属性传递给它,它将生成一些功能类去处理这些值,***_ViewBinding等这些类型的类。运行时注解的使用,比如Retrofit的@GET或者@POST等等都是运行时注解,它的注解的处理必须跟Retrofit的对象有关联,所以必须定义成运行时的。所以注解已经成为一种趋势,比如BufferKnife,EventBus,Darrger,Greendao,Arouter,Retrofit。。。看来我们也要去完成我们的一个注解了。

    三 知识准备

    Java JDK中包含了三个注解分别为@Override(校验格式),@Deprecated:(标记过时的方法或者类),@SuppressWarnnings(注解主要用于抑制编译器警告)等等java1.8之后有新增了一些注解像@FunctionalInterface()这样的,对于每个注解的具体使用细节这里不再论述。我们可以通过点击这里来看一下专业解释! 来看一下@Override的源码。

    @Target(ElementType.METHOD)

    @Retention(RetentionPolicy.SOURCE)

    }

    通过源代码的阅读我们可以看出生命注解的方式为@interface,每个注解都需要不少于一个的元注解的修饰,这里的元注解其实就是修饰注解的注解,可以理解成最小的注解单位吧。。。下面详细的看下每个注释注解的意义吧:

    @Target:

    说明了Annotation所修饰的对象范围,也就是我们这个注解是用在那个对象上面的:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。以下属性是多选状态,我们可以定义多个注解作用域,比如:

    @Target({ElementType.METHOD,ElementType.FIELD}),单个的使用 @Target(ElementType.FIELD)。

    (1).CONSTRUCTOR:构造方法声明。

    (2).FIELD:用于描述域也就是类属性之类的,字段声明(包括枚举常量)。

    (3).LOCAL_VARIABLE:用于描述局部变量。

    (4).METHOD:用于描述方法。

    (5).PACKAGE:包声明。

    (6).PARAMETER:参数声明。

    (7).TYPE:类、接口(包括注释类型)或枚举声明 。

    (8) .ANNOTATION_TYPE:注释类型声明,只能用于注释注解。

    官方解释:指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。 例如,此元注释指示该声明类型是其自身,即元注释类型。它只能用在注释类型声明上:

    @Target(ElementType.ANNOTATION_TYPE)

    public @interface MetaAnnotationType {

    }

    此元注释指示该声明类型只可作为复杂注释类型声明中的成员类型使用。它不能直接用于注释:

    @Target({})

    public @interface MemberType {

    ...

    }

    这是一个编译时错误,它表明一个 ElementType 常量在 Target 注释中出现了不只一次。例如,以下元注释是非法的:

    @Target({ElementType.FIELD, ElementType.METHOD, ElementType.FIELD})

    public @interface Bogus {

    ...

    }

    @Retention:

    定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。来源于java.lang.annotation.RetentionPolicy的枚举类型值:

    (1).SOURCE:在源文件中有效(即源文件保留)编译成class文件将舍弃该注解。

    (2).CLASS:在class文件中有效(即class保留) 编译成dex文件将舍弃该注解。

    (3).RUNTIME:在运行时有效(即运行时保留) 运行时可见。

    也就是说注解处理器能处理这三类的注解,我们通过反射的话只能处理RUNTIME类型的注解.

    官方解释:指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。只有元注释类型直接用于注释时,Target 元注释才有效。如果元注释类型用作另一种注释类型的成员,则无效。

    @Documented:

    指示某一类型的注释将通过 javadoc 和类似的默认工具进行文档化。应使用此类型来注释这些类型的声明:其注释会影响由其客户端注释的元素的使用。如果类型声明是用 Documented 来注释的,则其注释将成为注释元素的公共 API 的一部。Documented是一个标记注解,没有成员。

    @Inherited:

    元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。 注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。

    官方解释:指示注释类型被自动继承。如果在注释类型声明中存在 Inherited 元注释,并且用户在某一类声明中查询该注释类型,同时该类声明中没有此类型的注释,则将在该类的超类中自动查询该注释类型。此过程会重复进行,直到找到此类型的注释或到达了该类层次结构的顶层 (Object) 为止。如果没有超类具有该类型的注释,则查询将指示当前类没有这样的注释。

    注意,如果使用注释类型注释类以外的任何事物,此元注释类型都是无效的。还要注意,此元注释仅促成从超类继承注释;对已实现接口的注释无效。

    @Repeatable:

    Repeatable可重复性,Java 1.8新特性,其实就是把标注的注解放到该元注解所属的注解容器里面。可重复性的意思还是用demo来解释一下吧:

    //定义了一个 注解里面属性的返回值是其他注解的数组

    @Target(ElementType.FIELD)

    @Retention(RetentionPolicy.RUNTIME)

    public @interface MyCar {

    MyTag[] value(); ----MyTag 这里就是MyTag注解的容器。

    }

    //另外一个注解 就是上一个注解返回的注解

    @Target({ElementType.METHOD,ElementType.FIELD})

    @Retention(RetentionPolicy.CLASS)

    @Repeatable(MyCar.class) --------这里添加这个属性之后 我们的这个注解就可以重复的添加到我们定义的容器中了,注意里面的值时 我们定义的容器注解的class对象.

    public @interface MyTag { ........MyTag

    String name () default "" ;

    int size () default 0 ;

    }

    //使用

    @MyTag(name = "BWM", size = 100)

    @MyTag()

    public Car car;

    //如果我们的注解没有@Repeatable的话,这样写的话是报错的,加上之后就是这样的了

    这个注解是很特殊的,我们的注解中有@Repeatable(MyCar.class)这样的元注解的话,就是说当前标注的注解(MyTag注解)放到我们的值(MyCar.class)这个注解容器里面。那么我们再处理注解的时候获取到的是我们最后的注解容器(MyCar注解),这样说有点生硬下面看demo:

    使用:

    public class HomeActivity extends AppCompatActivity {

    @MyTag(name = "BWM", size = 100)

    @MyTag(name = "大众" ,size = 200) ......这里用了它的重复性.

    Car car;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_home);

    AnnotationProccessor.instance().inject(this); //这里去处理注解

    // Log.e("WANG", "HomeActivity.onCreate." + car.toString());

    }

    }

    处理过程:

    Class aClass = o.getClass();

    Field[] declaredFields = aClass.getDeclaredFields();

    for (Field field:declaredFields) {

    if(field.getName().equals("car")){

    Annotation[] annotations = field.getAnnotations();

    for (int i = 0; i

    Annotation annotation = annotations[i];

    //我们获取的该字段上面的注解只有一个 那就是 MyCar注解,看结果1的打印.

    //但是我们明明标注的是 MyTag. 为什么获取的是注解容器呢.

    //这就是@Repeatable的强大之处.

    Class aClass1 = annotation.annotationType();

    Log.e("WANG","AnnotationProccessor.MyCar"+aClass1 );

    }

    MyCar annotation = field.getAnnotation(MyCar.class);

    MyTag[] value = annotation.value();

    for (int i = 0; i

    MyTag myTag = value[i];

    Log.e("WANG","AnnotationProccessor.MyTag name value is "+myTag.name() );

    }

    }

    结果是:

    AnnotationProccessor.MyCarinterface cn.example.wang.routerdemo.annotation.MyCar.1

    AnnotationProccessor.MyTag name value is BWM.2

    AnnotationProccessor.MyTag name value is 大众.3

    三 自定义运行时注解

    通过以上的学习我们知道@interface是声明注解的关键字,每个注解需要注明生命周期以及作用范围.你可以给注解定义值.也就是再注解内部定义我们需要的方法.这样注解就可以再自己的生命周期内为我们做事.这里我们就自定义一个为一个对象属性初始化的注解吧,类似于Dagger的功能。

    public @interface MyTag {

    }

    注解里面的定义也是有规定的:

    注解方法不能带有参数。注解方法返回值类型限定为:基本类型、String、Enums、Annotation或者这些类型的数组。注解方法可以有默认值。注解本身能够包含元注解,元注解被用来注解其他注解。

    我们就来试一下吧!

    public @interface MyTag {

    //声明返回值类型,这里可没有大括号啊,可以设置默认返回值,然后就直接";"了啊。

    String name () default "" ;

    int size () default 0 ;

    }

    定义好了注解我们就来规定我们自定义的注解要在哪里用?要何时用?因为我们这里使用了反射来处理注解,反射就是在代码的运行的时候通过class对象反相的去获取类内部的东西,不熟悉反射机制的请移步这里Android开发者必须了解的反射基础,所以我们定义该注解的生命周期在运行时,并且该注解的的目的是为自定义属性赋值,那么我们的作用域就是FIELD。这里面定义了我们要初始化的bean的基本属性,给了默认值。这样我们就可以用该注解去创建我们需要的bean对象。

    @Target(ElementType.FIELD)

    @Inherited

    @Retention(RetentionPolicy.RUNTIME)

    public @interface MyTag {

    String name () default "" ;

    int size () default 0 ;

    }

    好了接下来看怎么使用我们的这个自定义的注解!

    public class HomeActivity extends AppCompatActivity {

    @MyTag(name = "BMW",size = 100)

    Car car;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_home);

    //这里我们要首先注册一下这个类

    AnnotationCar.instance().inject(this);

    //当程序运行的时候这里将会输出该类Car的属性值。

    Log.e("WANG","Car is "+car.toString());

    }

    }

    注解如果没有注解处理器,那么该注解将毫无意义。这里呢我们在这个Activity里面定义了一个Car类的属性,然后再car这个变量上面定义我们的注解,并且给我们的注解赋值。然后我们再onCreate方法里面初始化我们的注解处理器。然后运行代码,log日志将打印Car类的信息,先来看下结果吧

    cn.example.wang.routerdemo E/WANG: Car is Car [name=BMW, size=100]

    这样我们的自定义注解就有作用了,下面是”注解处理器“的代码,这里都是我们自己编写的处理注解的代码,其实系统是自带注解处理器的,不过它一般用来处理源码注释和编译时注释。

    //自定义的类

    /**

    * Created by WANG on 17/11/21.

    */

    public class AnnotationCar {

    private static AnnotationCar annotationCar;

    public static AnnotationCar instance(){

    synchronized (AnnotationCar.class){

    if(annotationCar == null){

    annotationCar = new AnnotationCar();

    }

    return annotationCar;

    }

    }

    public void inject(Object o){

    Class aClass = o.getClass();

    Field[] declaredFields = aClass.get...

  • ?

    在安卓手机上怎么运行java的应用程序?

    Gordon

    展开

    一、   安装JAVA程序方法:

     1、在网站上搜索一个APK格式的JAVA虚拟机,下载安装程序后安装在手机上,

    安装后手机上“所有程序”中增加此程序的图标,如下图(安装方法与安装

    其他程序一样,通过手机浏览器下载安装或通过电脑下载安装包)

    2、先下载好自己需要的JAVA安装包放在储存卡上,进入手机已安装好的“JAVA“,

    再点击菜单键(手机下方三条横线的图标),点击储存卡选项

    3、手机上会自动识别到储存卡上的JAVA软件,点击需要安装的一个软件,我们以安装QQ软件为列(注意:并不是保存的所有的JAVA软件都会被识别),选择后点击确定

    4、手机会提示选择文件夹,在点击空白处会自动跳转到下一个安装界面

    5、界面直接切换到下一步操作界面时,会提示:应用程序手机QQ不受信任,

    确定继续吗?请点击“确定”

    6、点击“确定“后,手机将开始安装JAVA软件

    7、安装完成后,手机会直接提示:想要启动应用程序吗?如需要启动就点击“确定“,如不需要就点击”取消“,QQ软件就已安装完毕,如果需要使用QQ软件,就进入手机上安装的“JAVA”程序,安装的JAVA软件都会在此程序打开后的页面显示,点击“手机QQ”即可运行

    (本文内容由百度知道网友babyAn涩贡献)

  • ?

    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可能活的更好。

    ————分割线————

    耿然原创,勤了周更,懒了月更。

    欢迎评论、吐槽、爆料、投诉、建议。

    评论比文章更精彩。

    ————分割线————

  • ?

    CMD 编译运行Java文件

    映冬

    展开

    首先我们在选择个目录创建我们所需要的文件。我选择在(F:\java)目录下。我起名为Test.java.注意文件的名字要和你的代码类名完全相同。

    2.编写Java代码,我们以简单的HelloWorld为例子。

    3.我们使用cmd命令窗口。编译我们的Test.java文件。命令:javac Test.java。一定注意,要在你的文件目录下进行。

    4.不出现报错,和提示证明编译成功,你会在你的.java文件旁看到一个类似名称的.class文件。

    5.使用java 命令运行.class文件。会出现我们所输出的结果。命令:java Test

  • ?

    跟我学java编程—Java跳转语句—break语句

    牟白凡

    展开

    有时可能不知道循环将要执行的次数,终止循环的条件可在以后确定,所以需要提供一种机制在条件满足的时候跳出循环。有时候,我们需要根据条件跳过循环中的一些语句。Java语言提供了break和continue两个关键字,用于改变程序的控制流。

    break语句通常用在前面介绍过的switch语句及循环语句中。当break语句用于switch语句时,可使程序跳出switch语句而执行switch语句之后的语句;当break语句用于while、do-while、for循环语句时,可使程序终止循环而执行循环后面的语句。

    break语句实际上就是为了使人能方便地描述从循环执行中退出的动作。通常应把break语句放在条件语句控制之下,以便在某些条件成立时立即结束循环。

    示例1:使用break语句退出循环

    在D盘Java目录下,新建“BreakSample1.java”文件。用记事本打开“BreakSample1.java”文件,输入以下代码:

    代码结构分析

    程序功能主要是演示break语句的使用。

    该循环在变量i的值等于5时,满足条件,然后执行break语句,结束整个循环,循环语句后面没有其它语句可执行,程序退出。

    编译“BreakSample1.java”文件,在命令行窗口输入“javac BreakSample1.java”并执行命令,编译通过后,在命令行窗口输入“java BreakSample1”运行Java程序,命令行窗口显示如下信息:

    图 8-11 示例1使用break语句退出循环输

    示例2:使用break语句跳出switch结构

    在D盘Java目录下,新建“BreakSample2.java”文件。用记事本打开“BreakSample2.java”文件,输入以下代码:

    代码结构分析

    程序功能主要是演示break语句跳出switch结构的使用方法。

    switch后面的表达式为变量i,i赋值5,然后依次与case语句的常量表达式进行匹配,匹配成功的项,执行break语句跳出switch结构。

    编译“BreakSample2.java”文件,在命令行窗口输入“javac BreakSample2.java”并执行命令,编译通过后,在命令行窗口输入“java BreakSample2”运行Java程序,命令行窗口显示如下信息:

    ■ 知识点拨

    break语句通常在循环中与条件语句一起使用。若条件值为真,则跳出循环。控制流转向循环后面的语句。

    如果已执行break语句,则不会执行循环体中位于break语句后的语句。

    在多层循环中,一个break语句只能向外跳出一层循环。

    ■ 思考与练习

    编写一个程序,要求循环接收用户输入的字符序列,并显示到屏幕上,当用户输入quit字符序列时,程序用break语句跳出循环,程序结束。

    提示:判读用户输入的字符序列是否为quit,可通过String类的equals方法进行判断,具体内容参考5.6节Java字符串类型。

  • ?

    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年在中国设立研发中心,在全球化产品的研发过程中,不断适应中国市场的本地需求,并为软件企业和各行业的信息化提供优秀的软件工具和咨询服务。

  • ?

    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读写

    Wadi

    展开

    前段时间在 github 上发现了阿里的 EasyExcel 项目,觉得挺不错的,就写了一个简单的方法封装,做到只用一个函数就完成 Excel 的导入或者导。刚好前段时间更新修复了一些 BUG,就把我的这个封装分享出来,请多多指教。

    附上源码:

    https://github/HowieYuan/easyexcel-method-encapsulation

    EasyExcel

    EasyExcel 的 github 地址:

    https://github/alibaba/easyexcel

    EasyExcel 的官方介绍:

    可以看到 EasyExcel 最大的特点就是使用内存少,当然现在它的功能还比较简单,能够面对的复杂场景比较少,不过基本的读写完全可以满足。

    一. 依赖

    首先是添加该项目的依赖,目前的版本是 1.0.2。

    com.alibabaeasyexcel1.0.2

    二. 需要的类

    1. ExcelUtil

    工具类,可以直接调用该工具类的方法完成 Excel 的读或者写。

    2. ExcelListener

    监听类,可以根据需要与自己的情况,自定义处理获取到的数据,我这里只是简单地把数据添加到一个 List 里面。

    publicclassExcelListenerextendsAnalysisEventListener {//自定义用于暂时存储data。//可以通过实例获取该值private List datas = new ArrayList<>();/** * 通过 AnalysisContext 对象还可以获取当前 sheet,当前行等数据 */ @Overridepublicvoidinvoke(Object object, AnalysisContext context) {//数据存储到list,供批量处理,或后续自己业务逻辑处理。 datas.add(object);//根据自己业务做处理 doSomething(object); }privatevoiddoSomething(Object object) { } @OverridepublicvoiddoAfterAllAnalysed(AnalysisContext context) { }public List getDatas() {return datas; }publicvoidsetDatas(List datas) {this.datas = datas; }}

    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