精华内容
下载资源
问答
  • 在一个项目中,作为过零比较器,发现8脚输出端电压输出稳定,电路如下 其中O_Enable输入电压从0.8~16V,调试过程中发现,无论该引脚输入多少V电压都存在输出稳定的问题,现象就是LM324的10脚输入>0V的时候...

    使用环境(蓝色粗体字为特别注意内容)
    1、硬件环境:LM324

    LM324由于超低的成本,而且集成了4运放,因而在低频领域有着广泛的应用。在一个项目中,作为过零比较器,发现8脚输出端电压输出不稳定,电路如下

    其中O_Enable输入电压从0.8~16V,调试过程中发现,无论该引脚输入多少V电压都存在输出不稳定的问题,现象就是LM324的10脚输入>0V的时候,8脚有时候并没有输出高电平,当用手或者一段金属导线(不与手或者其他导体接触)触碰8脚的时候,就能够正常输出高电平了! 而且想用万用表或者示波器测量8脚电平,测量表笔一接触就正常了!百思不得其解,希望有了解的朋友能够指点指点。最后将R15改为5.6k的电阻问题依然没有得到解决,难道运放是正常的,只是单片机IO口检测的问题?!有一点特别之处就是我用的是220v经过变压器整理滤波之后得到的电压作为vcc,不知道是否是市电干扰?

    最后证实的确是单片机IO检测的问题,我用的STM8 的RX(PD6)引脚来检测的,发现可以进入接收中断。但是好像IO口无法读到数据,最后发现是IO口初始化不当!

     

    展开全文
  • 1、输出调节问题 输出调节问题是控制理论及应用中的重要问题之一,涵盖了系统的镇定、跟踪给定的参考信号和抑制干扰等特殊的控制问题。输出调节的目标是寻找反馈控制器使所得到的闭环系统信号最终一致有界,并且...

    一、稳定性基本定义

    1.1 稳定性

    定义1(stable)平衡点x=0,在t_{0}时刻是稳定的,如果对于任意\epsilon > 0,存在一个常数\delta (t_{0},\epsilon )> 0,使得

                                                 \left \| x(t_{0}) \right \|< \delta (t_{0},\epsilon )\Rightarrow \left \| x(t) \right \|< \epsilon ,\forall t\geq t_{0}
    其中,x为系统状态向量。如果\delta (t_{0},\epsilon )=\delta (\epsilon ),即\delta与初始时刻无关,那么称该平衡点是一致稳定的。

                                                     

     
    1.2 渐近稳定性

    定义2(asymptotically stable):平衡点x=0,在t_{0}时刻是渐近稳定的,如果存在一个常数\delta > 0,使得

                                                \left \| x(t_{0}) \right \|< \delta\Rightarrow \lim_{t\rightarrow \infty }\left \| x(t) \right \|=0

                                                     


    说明:对于定义1,\delta的选取应不大于给定常数\epsilon。而通常情况下,\delta远小于\epsilon。其实,稳定性的物理意义说明系统有个初始状态x(t_{0}),在某一输入的驱动下,系统从这一初始状态运动到末态x(t)。现在, 如果有扰动使系统的初始状态在\left \| x(t_{0}) \right \|< \delta的这一小范围内发生偏离,若系统的终态仍能回到给定的\left \| x(t) \right \|< \epsilon范围内,那么就说x=0这一点是稳定的。当然,初态能够偏离的范围\delta的大小与你给定的末态偏离范围\epsilon有关。渐进稳定首先是稳定的,并且当t趋于无穷时,若系统的初始状态在\left \| x(t_{0}) \right \|< \delta范围内,系统的终态都会回到零点。可见,渐进稳定比稳定对系统的要求要严格地多,前者要求系统的末态趋于一个点,而后者只需使末态在某个范围内;前者要求末态趋近的这一点必须是零点,后者只需使末态所在的范围是零点周围的一个区域。


    二、有界性的基本定义

    2.1 一致有界性

    定义3(uniformly bounded, UB)系统微分方程的解为x,且x\left ( t_{0} \right )=x_{0},若系统一致有界,则对于某个\delta > 0,存在一个正常数d\left ( \delta \right )< \infty,使得对于所有的t> t_{0},都有
                                                                             \left \| x\left ( t_{0} \right ) \right \|< \delta \Rightarrow \left \| x\left ( t \right ) \right \|< d\left ( \delta \right )
    成立。这里d可能与\delta有关,但与t_{0}一定无关(一致性)。

                                                                  

    物理含义:系统从初态出发,经过一段时间,末态总能稳点在某个给定的球域内。


    2.2 最终一致有界

    定义4(ultimately uniformly bounded, UUB)系统微分方程的解为x,且x\left ( t_{0} \right )=x_{0},若系统最终一致有界,则对于某个包含原点的集合W\subset R^{n},存在一个非负常数T\left ( x_{0} ,W\right )< \infty,使得对于所有t> t_{0}+T,都有 

                                                                                  \left \| x\left ( t_{0} \right ) \right \|< \delta \Rightarrow x\left ( t \right )\in W

    成立。这里W可能与x_{0}有关,但一定与t_{0}无关。

                                                                

    物理意义:系统从初态出发,经过一段时间,末态总能回到原点附近某个给定的球域内。


    说明:定义4中的集合W通常是用以原点为球心、\epsilon为半径的一个超球(hyper-ball)来描述的,即W=B(0,\epsilon )。如果\epsilon \geq d(\delta ),UUB就退化成UB。虽然在定义4中没有明确指出,但是UUB主要是指\epsilon很小的情况,它代表了一种比UB要求更严格的稳定性。UUB的物理意义也就是说,系统从初态出发,经过一段时间,末态总能回到原点附近某个给定的球域内。
     


    参考文献:Khalil, Hassan K. "Nonlinear systems, 3rd." New Jewsey, Prentice Hall 9 (2002).


    三、区别与联系

    从左至右,从上到下依次表示稳定性、渐近稳定性、一致有界、最终一致有界。

                                                        

    从图中可发现,一致稳定与一致有界类似,而一致渐进稳定和一致最终有界类似。上述两组概念都能描述系统的稳定性,那么何时用第一组概念?何时用第二组概念?

    注意,Lypunov稳定性都是针对平衡点定义的。定义1、2中首先就说了系统的平衡点是原点,然后才陈述在什么条件下这个平衡点是稳定的。也就是说,用Lypunov理论讨论系统的稳定性时,实质讨论的是关于这一平衡点的稳定性,如果系统在这一平衡点处受到扰动,但仍能回复到指定的范围内,那么系统关于这一平衡点就是稳定的。

    但是,对于一些包含未知扰动量的不确定系统,也就是在鲁棒控制(robust control)中讨论的一些系统,系统的平衡点是无法确定的,因此第一组中针对平衡点的定义对这些不确定系统(uncertain system)就变得毫无意义。因为系统在不确定量的扰动下,可能根本就没有平衡点。所以对这一类uncertain system稳定性的分析,就可以通过微分方程的解与原点的接近程度来描述。这样,就引出了第二组概念UB和UUB。也就是说,第二组概念是专门用来分析不确定系统的稳定性的。


    总结

    1. 稳定和渐进稳定是描述具有平衡点的确定系统的稳定性的,讨论的是系统受到扰动后回复到平衡点的能力;
    2. UB和UUB是描述鲁棒控制中不确定系统的稳定性的,讨论的是微分方程的解与原点的接近程度;
    3. 渐进稳定要求系统的末态趋于零点,稳定只需使末态保持在某个范围内,且该范围远大于初态所约束的范围;
    4. UUB要求系统末态所在的超球半径远小于初态所在的超球半径,即UUB是比UB要求更严格的一种稳定性;
    5. 在实际中,UUB是不确定系统所能达到的最好的稳定性。

    上述内容来源于CSDN博主「lala你好哇」的原创文章,原文链接:稳定&渐进稳定,一致有界&一致最终有界

    四、有界性的判断条件

     

     

     

    展开全文
  • 1.管道复杂且不稳定,比如关闭输入才能获取输出,容易搞死SHELL运行的程序; 2.重定向等于接管了所有输出,不利于哪些不需要隐藏方式运行需要显示运行结果的命令(比如启动TOMCAT等)。 我这种是第三种思路,通过...
  • show engine innodb status输出内容包括以下几块(我所有试验都是在mysql5.6.22上实现) background threadsemphoreslatest detected deadlock(该部分内容不一定输出,只有在系统出现过死锁情况下才输出)latest ...

    show engine innodb status输出内容包括以下几块(我所有试验都是在mysql5.6.22上实现)

    • background thread
    • semphores
    • latest detected deadlock(该部分内容不一定输出,只有在系统出现过死锁情况下才输出)
    • latest foreign key error(该部分内容不一定输出,只有在系统出现过外键错误情况下才输出)
    • transactions
    • file I/O
    • logs
    • buffer pool and memory
    • insert buffer and adaptive hash index
    • row operations
    接下来我将对各个模块输出内容进行解析

    1.background thread(后台线程)


    图1 background thread 输出

    在执行show engine innodb status命令之后,在background thread之前的信息是innodb status相关状态信息,per second averages calculated from the last 29 seconds意思是说接下来的信息,是对过去29秒时间内innodb状态的输出。

    Innodb存储引擎室多线程的模型,因此其后台有多个不同的后台线程负责处理不同的任务。Master thread是一个非常核心的后台线程,主要负责缓冲池中的数据异步刷新到磁盘,保证数据的一致性。Master thread具有最高的线程优先级别,其内部由多个循环(loop)组成:主循环,后台循环,刷新循环,暂停循环。

    参数

    说明

    Srv_master_thread loops

    Master线程的循环次数,master线程在每次loop过程中都会sleepsleep的时间为1秒。而在每次loop的过程中会选择activeshutdownidle中一种状态执行。Master线程在不停循环,所以其值是随时间递增的。

    Srv_active

    Master线程选择的active状态执行。Active数量增加与数据表、数据库更新操作有关,与查询无关,例如:插入数据、更新数据、修改表等。

    Srv_shutdown

    这个参数的值一直为0,因为srv_shutdown只有在mysql服务关闭的时候才会增加。

    Srv_idle

    这个参数是在master线程空闲的时候增加,即没有任何数据库改动操作时。

    Log_flush_and_write

    Master线程在后台会定期刷新日志,日志刷新是由参数innodb_flush_log_at_timeout参数控制前后刷新时间差。

    :Background thread部分信息为统计信息,即mysql服务启动之后该部分值会一直递增,因为它显示的是自mysqld服务启动之后master线程所有的looplog刷新操作。通过对比activeidle的值,可以获知系统整体负载情况。Active的值越大,证明服务越繁忙。


    图2 master thread loop


    在图2中可以看到,master thread作为后台程序,一直不停的在loop,而loop过程中会选择active task 或者idle task函数执行,只有在innodb_force_recovery(对应图2的srv_force_recovery)参数设置值大于2的情况下,master thread会进入suspend状态。在srv_shutdown_state的值不等于SRV_SHUTDOWN_NONE的情况下,master thread会去执行shutdown task。输出值srv_active,srv_idle,srv_shutdown的值分别是在函数srv_master_do_active_task,srv_master_do_idle_task,srv_master_do_shutdown_task中++。而srv_master_do_active_task的执行是由当前activity_count与old_activity_count的值决定,只要这两个值不相等,则master调用active task。在执行数据库更改操作,如插入,删除,更新,表操作的情况下,当前的activity count的值会增加,系统调用active task。所以说,srv_active的值可以反映出系统的负载情况。值得注意的是background thread 部分的输出值是历史统计值,即mysqld服务启动之后会一直递增。


    srv_master_do_active/idle/shutdown_task函数实现大体类似,区别主要在与函数返回情况不同。

    srv_active


    srv_idle


    srv_shutdown



    master thread还负责日志(redo log:重做日志)刷新log_flush_and_write记录了日志刷新的次数。在master thread中通过调用srv_sync_log_buffer_in_background函数实现日志的刷新。master thread并不是没次loop都刷新日志,而是每秒都会刷新日志,如图3所示,只有在前后刷新时间差大于等于srv_flush_log_at_timeout(对应系统参数innodb_flush_log_at_timeout)时才刷新日志。该函数调用了log_buffer_sync_in_background函数,在log_buffer_sync_in_background函数中主要的操作包括四步:①获取log_sys->mutex;②获取log的lsn;③释放log_sys->mutex;④调用log_write_up_to函数将log刷新到磁盘,如图4所示。



    图3 日志刷新函数




    图4 日志刷新操作

    2.semphores


    Semphores输出内容可以分成两段,一部分是当前的等待,这部分只是包含了在高并发环境下的全部记录(这些记录不包括sleep)。第二部分是事件统计。相比系统等待,自旋锁的开销较小,但是它是活跃的等待,会浪费CPU资源,如果有大量的自旋等待和自旋轮转,则会浪费大量的CPU资源。

    参数

    说明

    OS WAIT ARRAY INFO

    系统等待队列信息

    Reservation count

    线程尝试访问os wait array的次数,大于等于线程进入os wait状态的线程数(因为尝试放入os wait array可能不成功,不成功的时候reservation count也会++)

    Signal count

    线程被唤醒的次数,进入os wait的线程,在占用资源线程释放mutex的时候会通过signal唤醒等待线程。

    Mutex spin wait

    线程自旋等待次数,线程在获取mutex过程中如果没有获取到mutex,则首先进入自旋状态,这个时候mutex spin wait++

    Mutex Rounds

    进入spin wait的线程,通过不断循环来等待获取mutex,循环的次数称为round(理解可以参照图 4)

    Mutex Os wait

    线程进入系统等待的次数,现在在获取mutex过程中,如果没有在第一时间内获取,则进入自旋,自旋达到设定的时间需求后依旧没能获取到mutex,这个时候线程进入系统等待。Os wait的值增加。

    Rw-sharerw-excl:对应参数含义类似。

    Spin rounds per waits mutex

    每次mutex自旋等待中round的次数,值=mutex rounds/mutex spin wait

    Spin rounds per waits rw-share(读锁)

    每次rw-sahre自旋等待中round的次数,值=rw-share rounds/rw-share spin wait

    Spin rounds per waits rw-excl(写锁)

    每次rw-excl自旋等待中round的次数,值=rw-excl rounds/rw-excl spin wait

    注:统计信息部分给出的是自mysqld服务启动以来的累计值,进入spin wait的线程不一定会进入os wait状态,但是进入os wait状态的线程必然经历过spin wait状态。如果出现spin wait的次数与os wait次数相等或者相差不大的情况,证明绝大多数线程在spin wait状态结束后最终进入os wait状态,这种情况与innodb mutex设计初衷相违背。如果出现这样的情况,第一证明系统处于高负载,资源竞争激烈;第二,可以通过改变参数innodb_spin_wait_delayinnodb_sync_spin_loops的值来减少资源浪费。Innodb_sync_spin_loops控制的是进入spin wait状态之后循环次数,innodb_spin_wait_delay是为了延长循环时间的。统计信息给的并非实时状态,而是历史状态,如果需要观察实时状态,则必须记录两个时间点差值,这样才能充分反映当前系统状态非高并发情况下是看不到第一部分的等待信息的,所以当你看到有第一部分信息出现的时候证明你需要关注系统状态。


    Innodb中的锁包括latchlock,在semphores部分指的都是latchinnodb自行实现了mutex,同时为了获取更好的并发性能,在mutex的基础上实现了读写锁。Mutex和写锁是完全互斥的,读锁在同一时间允许多个线程共同访问。


    在数据库中latch lock都被称为锁,在innodblock针对的是事务,latch针对的是线程,latch又可以分为mutexrw_locklatch的目的是保证并发的线程操作临界资源的正确性。Mutex的数据结构及说明如表2所示。

    表 2 mutex 数据结构

    变量名称

    说明

    lock_word

    用来进行TAS操作

    os_fast_mutex

     

    waiters

    是否有线程等待

    list

    链表

    thread_id

    持有mutex线程ID

    file_name

    mutex被锁住时的文件名

    line

    mutex被锁住时的行

    level

    latch所在的level,例如Debug模式

    cfile

    创建mutex对象时的文件名

    cline

    创建mutex时所在行

    magic_n

    debug模式下检测内存是否越界

     innodb为了提高读的性能,自定义了read write lock,也就是读写锁。其设计原则是:

    Ø 同一时刻允许多个线程同时读取内存中的变量

    Ø 同一时刻只允许一个线程更改内存中的变量

    Ø 同一时刻当有线程在读取变量时不允许任何线程写存在

    Ø 同一时刻当有线程在更改变量时不允许任何线程读,也不允许出自己以外的线程写(线程内可以递归占有锁)。

    Ø 当有rw_lock处于线程读模式下是有线程写等待,这时候如果再有其他线程读请求锁的时,这个读请求将处于等待前面写完成。

    从上面5点我们可以看出,rw_lock在被占用是会处于读状态和写状态,我们称之为S-latch(读共享)X-latch(写独占),《MySQL技术内幕:innodb引擎》对S-latchX_latch的描述如表 3所示。

    表 3 锁类型兼容矩阵

    x-latchs-latch
    x-latchconflictconflict
    s-latchconflictcompatible


    操作系统本身有提供latch,但是Innodb基于自旋锁重写了mutex,其主要原因是:因为传统的mutex在获取不到的时候,线程会直接进入wait队列,等待被唤醒,cpu在线程进入wait队列的时候切换上下文环境。常见操作系统线程上下文切换耗时大约25um,再加上lockunlock的时间开销。Innodbspin的时间设置为20um,当前奔腾平台一个操作持有mutex或者rw-lock的时间一般在1-20um,自旋20um在绝大多数情况下能获取到mutex,相比进入os waitspin的时间20um不算多。表 4给出了mutex的获取流程。通过TAS(test_and_set)指令检测mutex是否被释放。表中参数sync_spin_rounds对应innodb参数innodb_sync_spin_rounds,主要是为了避免无限自旋而设计的。在线程自旋无法获取mutex的时候,线程进入os wait队列,并将mutex数据结构中waiters值设置为1,为的是在持有mutex线程释放mutex时,能去os wait队列中唤醒该线程。 

    此外,Innodb基于自己的mutex实现基础上实现了rw-lock,读写锁包括x-latchs-latchS-latch表示对临界资源上共享锁,允许多个线程访问资源,x-latch表示对临界资源上排他锁,只运行一个线程访问该资源。信号量获取流程如图 21所示。

    表 4 获取mutex流程

    if (test_and_set(mutex->lock_word)==0){
    get mutex;
    return;}
    loop:
    while(mutex->lock_word!=0&& i<sync_spin_rounds){spin;i++;}
    if (test_and_set(mutex->lock_word)==0){
    get mutex; return;}
    reserve a cell from wait array;
    mutex->waiters=1;
    for(i=0;i<4;i++){
    if(test_and_set(mutex->lock_word)==0){
    get mutex; free cell; return;}
    wait event;
    goto loop;}


     

    图5 mutex获取流程


    Innodb提供了两个参数可以对mutexspin进行调整,参数如图 6所示。Innodb_sync_spin_loops设定的是线程在获取mutex过程中,如果没在第一时间获取到mutex,线程首先进入自旋,自旋的loops达到该值之后仍未获取到mutex,则释放占用的资源,进入array cell,状态os wait,等待被唤醒。Innodb_sync_wait_delay设定了在spin的过程中,依赖区间[0,innodb_spin_wait_delay]生成随机数,产生延迟。对于稳定运行系统,可以根据系统获取mutex平均等待时间,合理设置这两个参数值,例如:semphores部分内容显示,spin_waitos wait的值基本相近,那就说明该系统spin效果不明显,innodb之所以采用spin的原因就是为了减少线程进入os wait以及被唤醒的开销,如果系统结果显示,spin wait之后最终还是要去到os wait,那就证明spin设置较大值是一种浪费。



    图6 自旋相关参数



    展开全文
  • 上次在《【Java】无须额外的包,把Java中的内容输出到Excel中,无乱码,绝对兼容Excel2003与2007》(点击打开链接)给出了一种无须额外的Excel包就能够输出Java的内容的到Excel的方案,但是整个方案都是在操作能被...

    上次在《【Java】无须额外的包,把Java中的内容输出到Excel中,无乱码,绝对兼容Excel2003与2007》(点击打开链接)给出了一种无须额外的Excel包就能够输出Java的内容的到Excel的方案,但是整个方案都是在操作能被Excel读取的.xml文件。构造.xml。这种方法编程起来可能有点麻烦,不够直观。因此,可以利用Apache官方开发的poi插件,实现Java与Excel的交互。


    一、基本目标

    首先在C盘有个1.xls,里面的内容如下:


    然后通过Apache Poi Java插件利用Java可以读取出来,

    之后再通过Apache Poi Java插件利用Java输出如下样式:



    二、基本准备

    1、首先打开Apache Poi的官网http://poi.apache.org/(点击打开链接),按照下图的顺序下载一个最新的稳定BIN版。顺便选择一个镜像,哪个快就搞哪个。

    2、在Eclipse中新建一个Java工程,并且在里面新建一个lib文件夹。下载之后解压poi-bin-3.11-20141221.zip,把跟目录下的jar包,lib文件夹里面的jar包,ooxml-lib的Jar包,拷贝到你在Eclipse新建的Java工程下的新建出来的lib文件夹。


    3、在Eclipse中为新建的Java工程添加这个额外的Jar插件。右击你新建的Java工程,属性,Java Build Path->Add JARs,选择刚刚拷贝过来lib文件夹的所有jar。那么Apache poi插件正式,在你的JAVA工程下工作。



    三、制作过程

    1、首先在Java头引入Poi插件。

    package poiExcel;
    
    //输入输出到文件必备
    import java.io.*;
    
    import org.apache.poi.hssf.usermodel.*;
    import org.apache.poi.hssf.util.*;
    import org.apache.poi.poifs.filesystem.*;
    
    2、先是把C:\1.xls的内容读取到Java里面来,逐个单元格输出

    	public static void ExcelRead() throws Exception {
    		//确定要操作的是c:/1.xls
    		HSSFWorkbook workbook = new HSSFWorkbook(new POIFSFileSystem(
    				new FileInputStream("c:/1.xls")));
    		//取第0个单元表
    		HSSFSheet sheet = workbook.getSheetAt(0);
    		//sheet.getPhysicalNumberOfRows();求出所有行数
    		for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
    			//取一行操作
    			HSSFRow row = sheet.getRow(i);
    			//row.getPhysicalNumberOfCells();求出本行的单元格数,也就是列数
    			for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
    				System.out.print(row.getCell(j) + "\t");
    			}
    			System.out.println();
    		}
    	}
    3、之后是在Java设置好整个单元格的样式,输出到Excel中。整个过程有点像JavaScript操作HTML的DOM节点。先构造单元格、再通过单元格构造行、最后通过行构造整张表,再把整张表输出的过程。

    	public static void ExcelWrite() {
    
    		// 创建一个webbook,对应一个Excel文件
    		HSSFWorkbook workbook = new HSSFWorkbook();
    		// 在webbook中添加一个Excel单元表sheet,并设置单元表的问题
    		HSSFSheet sheet = workbook.createSheet("单元表标题");
    
    		// 在sheet中添加第0行,注意老版本poi对Excel的行数列数是有限制
    		HSSFRow row = sheet.createRow(0);
    		// 创建一个居中样式
    		HSSFCellStyle style = workbook.createCellStyle();
    		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    		// 在于这个居中样式的基础上,添加表格边框样式
    		setBoderStyle(style);
    		// 创建第0个单元格
    		HSSFCell cell = row.createCell(0);
    		// 设置这个单元格的内容为“一”
    		cell.setCellValue("一");
    		// 设置这个单元格的格式为上面设置好的居中样式+表格边框样式
    		cell.setCellStyle(style);
    		// 同理创建第1个单元格并且设置好样式,下面以此类推
    		cell = row.createCell(1);
    		cell.setCellValue("二");
    		cell.setCellStyle(style);
    		cell = row.createCell(2);
    		cell.setCellValue("三");
    		cell.setCellStyle(style);
    
    		// 创建第1行
    		row = sheet.createRow(1);
    		// 清空上面设置好的居中样式+表格边框样式
    		style = workbook.createCellStyle();
    		// 设置字体样式
    		setFontStyle(workbook, style);
    		cell = row.createCell(0);
    		cell.setCellValue("111");
    		cell.setCellStyle(style);
    		cell = row.createCell(1);
    		cell.setCellValue("222");
    		cell.setCellStyle(style);
    		cell = row.createCell(2);
    		cell.setCellValue("333");
    		cell.setCellStyle(style);
    		// 自动调整列宽
    		allColumnAutoSize(sheet);
    
    		// 将文件存到指定位置
    		try {
    			//false代表覆盖输出
    			FileOutputStream fileOutputStream = new FileOutputStream(
    					"c:/1.xls", false);
    			workbook.write(fileOutputStream);
    			//人走带门
    			fileOutputStream.close();
    			workbook.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    
    	}
    其中,涉及到设置边框样式的方法如下:

    	public static void setBoderStyle(HSSFCellStyle style) {
    		style.setBorderTop((short) 6); // 上边框为双线
    		style.setBorderRight((short) 3); // 右边框为虚线
    		style.setBorderBottom((short) 1); // 底边框为单线
    		style.setBottomBorderColor(HSSFColor.RED.index);// 底边框为红色
    	}
    设置单元格字体的方法如下:

    	public static void setFontStyle(HSSFWorkbook workbook, HSSFCellStyle style) {
    		HSSFFont font = workbook.createFont();// 要设置字体样式先要创建字体
    		font.setFontHeightInPoints((short) 16);// 字号
    		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗
    		font.setItalic(true);// 斜体
    		font.setColor(HSSFColor.RED.index);// 字体颜色是红色
    		style.setFont(font); // 把这个设置好的字体样色压入样式
    	}

    自动调整列宽的方法如下:

    	public static void allColumnAutoSize(HSSFSheet sheet) {
    		// 遍历所有单元格,把单元格皆设置为最优列宽。
    		for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
    			HSSFRow row = sheet.getRow(i);
    			for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
    				sheet.autoSizeColumn(j);
    			}
    		}
    	}


    四、总结

    最后整个Java文件如下,主函数就两个方法,一个EXCEL到JAVA,一个JAVA到EXCEL。实际应用这个插件,创建单元格完全可以利用for与while等循环,从一个ArrayList读取数据,不停地填充单元格。

    package poiExcel;
    
    //输入输出到文件必备
    import java.io.*;
    
    import org.apache.poi.hssf.usermodel.*;
    import org.apache.poi.hssf.util.*;
    import org.apache.poi.poifs.filesystem.*;
    
    public class poiTest {
    
    	public static void ExcelRead() throws Exception {
    		//确定要操作的是c:/1.xls
    		HSSFWorkbook workbook = new HSSFWorkbook(new POIFSFileSystem(
    				new FileInputStream("c:/1.xls")));
    		//取第0个单元表
    		HSSFSheet sheet = workbook.getSheetAt(0);
    		//sheet.getPhysicalNumberOfRows();求出所有行数
    		for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
    			//取一行操作
    			HSSFRow row = sheet.getRow(i);
    			//row.getPhysicalNumberOfCells();求出本行的单元格数,也就是列数
    			for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
    				System.out.print(row.getCell(j) + "\t");
    			}
    			System.out.println();
    		}
    	}
    
    	public static void setBoderStyle(HSSFCellStyle style) {
    		style.setBorderTop((short) 6); // 上边框为双线
    		style.setBorderRight((short) 3); // 右边框为虚线
    		style.setBorderBottom((short) 1); // 底边框为单线
    		style.setBottomBorderColor(HSSFColor.RED.index);// 底边框为红色
    	}
    
    	public static void setFontStyle(HSSFWorkbook workbook, HSSFCellStyle style) {
    		HSSFFont font = workbook.createFont();// 要设置字体样式先要创建字体
    		font.setFontHeightInPoints((short) 16);// 字号
    		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗
    		font.setItalic(true);// 斜体
    		font.setColor(HSSFColor.RED.index);// 字体颜色是红色
    		style.setFont(font); // 把这个设置好的字体样色压入样式
    	}
    
    	public static void allColumnAutoSize(HSSFSheet sheet) {
    		// 遍历所有单元格,把单元格皆设置为最优列宽。
    		for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
    			HSSFRow row = sheet.getRow(i);
    			for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
    				sheet.autoSizeColumn(j);
    			}
    		}
    	}
    
    	public static void ExcelWrite() {
    
    		// 创建一个webbook,对应一个Excel文件
    		HSSFWorkbook workbook = new HSSFWorkbook();
    		// 在webbook中添加一个Excel单元表sheet,并设置单元表的问题
    		HSSFSheet sheet = workbook.createSheet("单元表标题");
    
    		// 在sheet中添加第0行,注意老版本poi对Excel的行数列数是有限制
    		HSSFRow row = sheet.createRow(0);
    		// 创建一个居中样式
    		HSSFCellStyle style = workbook.createCellStyle();
    		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    		// 在于这个居中样式的基础上,添加表格边框样式
    		setBoderStyle(style);
    		// 创建第0个单元格
    		HSSFCell cell = row.createCell(0);
    		// 设置这个单元格的内容为“一”
    		cell.setCellValue("一");
    		// 设置这个单元格的格式为上面设置好的居中样式+表格边框样式
    		cell.setCellStyle(style);
    		// 同理创建第1个单元格并且设置好样式,下面以此类推
    		cell = row.createCell(1);
    		cell.setCellValue("二");
    		cell.setCellStyle(style);
    		cell = row.createCell(2);
    		cell.setCellValue("三");
    		cell.setCellStyle(style);
    
    		// 创建第1行
    		row = sheet.createRow(1);
    		// 清空上面设置好的居中样式+表格边框样式
    		style = workbook.createCellStyle();
    		// 设置字体样式
    		setFontStyle(workbook, style);
    		cell = row.createCell(0);
    		cell.setCellValue("111");
    		cell.setCellStyle(style);
    		cell = row.createCell(1);
    		cell.setCellValue("222");
    		cell.setCellStyle(style);
    		cell = row.createCell(2);
    		cell.setCellValue("333");
    		cell.setCellStyle(style);
    		// 自动调整列宽
    		allColumnAutoSize(sheet);
    
    		// 将文件存到指定位置
    		try {
    			//false代表覆盖输出
    			FileOutputStream fileOutputStream = new FileOutputStream(
    					"c:/1.xls", false);
    			workbook.write(fileOutputStream);
    			//人走带门
    			fileOutputStream.close();
    			workbook.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    
    	}
    
    	public static void main(String[] args) throws Exception {
    		ExcelRead();
    		ExcelWrite();
    	}
    
    }
    


    展开全文
  • 由于Jupyter Lab版本变化比较频繁,改变字体的方法也不太稳定。适用版本:JupyterLab 3.0.12。 方法一:通过菜单Settings->Jupyterlab Theme,生成themes.jupyterlab-settings文件 Settings菜单Jupyterlab Theme...
  • Tomcat关闭日志输出

    千次阅读 2018-04-15 21:41:53
    一般在部署Tomcat后,运行久了,catalina.out文件会越来越大,对系统的稳定造成了一定的影响。...Tomcat怎么关闭日志输出1、直接修改catalina.sh文件的输出语句在文件中找到以下内容:[java] view plai...
  • Linux nohup不输出日志文件的方法

    万次阅读 2018-11-16 11:37:39
    最近在Linux上部署视频流推送应用时,由于网络不稳定等原因程序会不断的输出错误信息,结果导致程序运行一天下来日志文件直接占满磁盘,解决方法就是不再输出日志文件,命令如下: 只输出错误信息到日志文件: ...
  • 命令行日志输出

    万次阅读 2014-06-18 13:56:40
    在linux中运行命令行时,会输出一些日志信息,特别典型的是启用WebLogic命令时,输出一些信息,当启用demon模式运行时,又想收集这些信息咋办? 解决的办法就是使用输出重定向,如下面的命令: nohup ./start...
  • 反馈系统的稳定

    千次阅读 2018-12-22 22:33:13
    作为一种经典的模型,反馈能够带来很多好处,比如展宽带宽,降低输出阻抗等。但与此同时,它也会带来一些副作用。首先是增益的下降,这是众所周知的,且解决方法也很简单,多串联几个增益级即可。而另一个副作用则是...
  • MSP432输入输出模块

    千次阅读 2019-06-30 19:47:10
    第6章MsP432微控制器输入输出模块 单片机中的输入输出模块是供信号输入、输出所用的模块化单元。MsP432单片机的片内输入输出模块非常丰富,典型的输入输出模块有:通用O端口、模/数转换模块、比较器E  定时器。...
  • linux命令行日志输出

    万次阅读 2015-10-10 15:04:11
    在linux中运行命令行时,会输出一些日志信息,特别典型的是启用WebLogic命令时,输出一些信息,当启用demon模式运行时,又想收集这些信息咋办? 解决的办法就是使用输出重定向,如下面的命令: nohup ./start...
  • 在具体内容展开之前,我们先认识下蚂蚁金服智能科技团队目前对外输出的技术产品体系,通过“BASIC”便可基本概括五大产品方向:Blockchain (区块链)、Artificial-Intelligence(人工智能)、Security(安全)、 IoT...
  • gzip压缩输出

    千次阅读 2012-07-27 18:55:16
    一、gzip介绍  gzip是GNU zip的缩写,它是一个GNU自由软件的文件...1992年10月31日第一次公开发布,版本号是0.1,目前的稳定版本是1.2.4。  Gzip主要用于Unix系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件
  • PHP输出缓冲区的总结

    千次阅读 2019-02-26 15:59:26
    PHP输出缓冲区:  缓冲区:实际上是一个内存地址空间。它用来存储速度不同步的设备或者... PHP的输出流包含很多内容,通常都是开发者要PHP输出的文本,这些文本大多是用echo或printf()函数来输出的    1&gt...
  • STM32的GPIO配置不同输出速度会有什么影响?

    千次阅读 多人点赞 2019-06-14 20:05:04
    置顶/星标公众号,不错过每一条消息今天有人问:GPIO配置不同输出速度会有什么影响?你知道答案吗?1写在前面这个问题看起来比较简单,我相信很多人都能说出答案。但是,很多...
  • nmap输出结果选项

    千次阅读 2010-11-03 17:35:02
    输出 任何安全工具只有在输出结果时才是有价值的,如果没有通过组织和 易于理解的方式来表达,复杂的测试和算法几乎没有意义。Nmap提供了一些 方式供用户和其它软件使用,实际上,没有一种方式可以使所有人满意...
  • 大流量数据异步输出

    千次阅读 2009-02-12 20:47:00
    在大型网站中常常会遇到大流量的数据输出问题,过于频繁的输出到DB、文件、第三方系统都会带来不稳定性和低效率。因此需要采用一定的方式来解决这个问题,其实这部分内容的简单处理框架早就用在实际项目中,不过今天...
  • PIC单片机入门_输入输出端口详解

    万次阅读 2016-11-10 09:33:53
     要把端口口线作为输出,必须要把该口线预先设定为输出态,即相应的TRIS Latch的内容必须为0。 ⒊从端口引脚输入数据  要把端口口线作为输入,必须要把该口线预先设定为输出态,即相应的TRIS Latch的内容必须...
  • Windows输出Apple ProRes编码视频

    千次阅读 2019-10-26 13:15:37
    本文不定期更新,最新内容请访问:https://www.shuaiqi.me/2018/08/20/windowsshuchuapple-proresbianmashipin/ 2019.02.13 感谢网友Cudo提醒,...对于Adobe系列软件:CC 2019及以上版本推荐使用原生输出方式(...
  • Xilinx FPGA输入输出缓冲 BUF 的使用

    千次阅读 多人点赞 2020-02-13 13:36:12
    驱动:驱动在时钟约束部分说过,当信号扇出过大是可以通过加BUFG来增加稳定性,这里的BUFG就是全局缓冲,以BUFG为例,该原语的输入信号可以是IBUFGDS的输出也可以是逻辑信号的输出(内部信号),但是过一次BUFG有...
  • Android稳定性测试工具Monkey的使用

    万次阅读 2017-01-15 13:07:12
    Monkey是一个命令行工具,它可以运行在我们的模拟器或者设备当中。...我们能够使用Monkey工具来对我们所...Monkey测试是一种为了测试软件的稳定性,健壮性的快速有效的方法。Monkey程序介绍 Monkey是Android自带的系统

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 207,110
精华内容 82,844
关键字:

内容稳定输出