精华内容
下载资源
问答
  • 好长时间没上号,就是一个春节养了不少膘,好怀念以前瘦的时候,想当年我只有六斤四两。啊讲重点讲重点,作为一个即将毕业的大学生,看着大家开始上网课,做作业,内心十分渴望,你们不要羡慕我们放假没作业,你们...

    e39e67b645f27aaa9b85fcfd847107f6.png

    好长时间没上号,就是一个春节养了不少膘,好怀念以前瘦的时候,想当年我只有六斤四两

    啊讲重点讲重点,作为一个即将毕业的大学生,看着大家开始上网课,做作业,内心十分渴望,你们不要羡慕我们放假没作业,你们知道玩一天多累吗?

    玩久了就想做一些正经事,写一篇关于word文档的个人心得分享一下。

    eb05ef2ce178ca565177c04e7c404a9f.png

    曾经做过一篇Excel表格里的Ctrl类快捷键,不过有部分快捷键只能在office版本里使用,WPS貌似不得行,进主页找吧,公众号里也有。

    今天谈谈Word文档里有哪些小技巧值得被摆上台面,毕竟我实在接受不了排版不工整的文件到我眼前。

    重点!以下是我个人理解!大神手下留情!

    - 基本内容 -

    Word最基础的无非也就字号大小、字体选择、段落分布,最多加个颜色,弄点造型:

    字号选择:标题可以用二号、三号,副标题就用四号,正文用小四或者五号都行;

    字体选择:打印纸张的话可以宋体,演示可以选择黑体或者微软雅黑,

    如果交文件、作业啥的建议用宋体,如果是写读后感、小作文什么的可以用黑体或微软雅黑,有特殊爱好的当我没说;

    行间距 :常见行间距是1.5倍,因为这个间距比较符合一般人的阅读习惯,1.0倍我个人是适合整理资料,2.0倍我常用于各类标题。

    首行缩进:也就是平常写作文中的空两格,便于找到每个段落。

    纸张方向:分竖向、横向,这个不用多说,但是如果希望其中一页换方向怎么办,可选择当前页面的“页面设置”,调整方向后应用于“插入点之后”。

    页边距 :一般常规就可以了,但是有需要放置更多内容的可能就需要调整页边距,以满足打印要求。

    分隔符 :常用分页和空白页,分页是将文本内容直接调整到下一页,而空白页是在文本内容后直接添加一个空白的页面。

    d160b92da520b0f1aa7ae81d15b214cb.png

    - 快捷按键 -

    避免凑字数,只讲容易被忽略的快捷键:

    Ctrl + V:粘贴键都会用,但是真的会用吗?粘贴还可以选“保留源格式”“合并格式”“仅粘贴文本”“粘贴为图片”等等;

    保留源格式可以将复制的内容连同它所带的格式一起粘贴过来,一般为默认粘贴;

    合并格式是复制了内容并将内容调整为和我的文档相一致的格式;

    仅粘贴文本就只是将内容文本粘贴过来,非文字的内容则不会出现;

    粘贴为图片是指复制的内容可以转换为图片,转换为图片后即无法继续编辑。

    Ctrl + Z:撤回!撤回!撤回!

    Ctrl + E:居中对齐,多方便的按键,鼠标用多了手腕不酸吗。

    Ctrl + F2:打印预览,想知道文档打印出来的效果可以提前预览一下,顺便检查有没有不公整的地方。

    以下是我整理的使用频率比较高的快捷键,或者说在我们这个水平能够频繁用到的快捷键。

    2e9b1eada8cec442fb685d6b42f61a09.png

    - 鼠标使用 -

    最后再讲一个,鼠标的使用也至关重要,至少某些程度上:

    鼠标左键:拖动选择,持续按住鼠标左键可以选中文字,同时也可以将选中的文字拖动到其他位置。

    Ctrl + 鼠标左键:多重选择,按住Ctrl键,不停使用鼠标左键可以选中多组不相连的文字内容。

    Shift + 鼠标左键:快速选择,鼠标左键点击需要选中内容的首端,按住Shift键的同时鼠标左键点击需要选中内容的尾端,即可快速选中首尾两端之间的所有内容。

    Alt + 鼠标左键:纵向选择,按住Alt键,再使用鼠标左键点击拖动,可以纵向选择文本内容或选择一块文本内容。

    741f3cf27abf7fa62dde9db2c82d2475.png

    -----------------分割线-----------------------

    写的不全,一部分是学艺不精,另一部分是脑子不好使,编辑一段看起来不太愚蠢的文字实在是耗尽了我的脑库,

    重要的是,我希望能让我的师弟师妹们少走弯路,后面我做了张导图,有需要的后台回复“word”获取,知乎这里我真不知道咋操作,有需要的就绕一绕吧。

    当然了,这些基础内容相信很多同学早掌握了,看到这里就当被骗了吧

    xīxī。

    90f2d3a9d1b749d8864b6b47dee93080.png
    展开全文
  • 图片的生成

    2019-05-28 08:13:52
    先是在控制器写方法,查询图片要的信息,学生名字,考试时间,成绩,证书编号,证书颁发日期,再获取空白证书的物理地址,再将图片栅格化,再封装一个画板,定义单色画笔。 接着进行绘画,先是学生的名字,定义了...

    很多时候想要把表格里的信息放到图片里显示,显得更加美观,这时候就用到了图片的生成,表格不像图片,表格很固定,没有什么背景,而图片就不一样,图片就有背景。先是在控制器写方法,查询图片要的信息,学生名字,考试时间,成绩,证书编号,证书颁发日期,再获取空白证书的物理地址,再将图片栅格化,再封装一个画板,定义单色画笔。
    在这里插入图片描述

    接着进行绘画,先是学生的名字,定义了字体大小,画笔的样式,开始到结束的坐标,还有考试时间,证书编号,证书颁发时间,设置jpeg保存格式,最后以byte类型输出。

    在这里插入图片描述

    Html部分,先是把声明的方法对应控制器和按钮点击事件,再获取证书表选中行,再判断是否只选中一条,再获取证书ID,如果选中多条数据,就提示只能选中一条数据,如果没有选中,就提示选中一条数据。

    在这里插入图片描述

    选中一条数据
    在这里插入图片描述

    点击生成图片后页面跳转显示图片。

    在这里插入图片描述

    展开全文
  • 机房收费系统之学生查看上机记录

    热门讨论 2019-10-18 17:06:30
    学生查看上机记录这个窗体除了唯一一个我们从来没接触的导出Excel表格外,也是很简单的一个窗体。也还好,我在优化学生的时候就做过一次导出Excel表,当时也费了不少时间,到现在机房收费的时候也还算是很顺手的。 ...

            学生查看上机记录这个窗体除了唯一一个我们从来没接触的导出Excel表格外,也是很简单的一个窗体。也还好,我在优化学生的时候就做过一次导出Excel表,当时也费了不少时间,到现在机房收费的时候也还算是很顺手的。

    窗体界面:

    思维导图:

    基本代码:

    '声明变量
    '窗体中的控件和背景图片可随着窗体的变化而变化
    Option Explicit
    Dim ap() As cp  '定义窗体数组
    '定义窗体过程
    Private Sub ai()
    Dim i As Integer
    On Error GoTo uerror  '跳过无width属性控件
    For i = 0 To Controls.Count - 1
    With ap(i)
    .wp = Controls(i).Width / Me.ScaleWidth
    .hp = Controls(i).Height / Me.ScaleHeight
    .lp = Controls(i).Left / Me.ScaleWidth
    .tp = Controls(i).Top / Me.ScaleHeight
    End With
    Next i
    Exit Sub
    uerror:
     Resume Next
    End Sub
    
    
    Private Sub Form_Load()
      Me.AutoRedraw = True        'AutoRedraw是VB中的自动重绘窗口,当窗口被某个东西遮蔽了之后,窗口上那个位置原来绘制的图像被遮盖后可以用它把遮蔽的那部分重新绘制出来。
      
      ReDim ap(0 To Controls.Count - 1)
     ai
    
        '表格中的标题展示
        With myFlexgrid
            .CellAlignment = 4                'CellAlignment该属性返回或设置的数值确定了一个单元格或被选定的多个单元格所在区域的水平和垂直对齐方式。
            .TextMatrix(0, 0) = "卡号"
            .TextMatrix(0, 1) = "姓名"
            .TextMatrix(0, 2) = "上机日期"
            .TextMatrix(0, 3) = "上机时间"
            .TextMatrix(0, 4) = "下机日期"
            .TextMatrix(0, 5) = "下机时间"
            .TextMatrix(0, 6) = "消费金额"
            .TextMatrix(0, 7) = "余额"
            .TextMatrix(0, 8) = "备注"
       End With
       
    End Sub
    
    Private Sub Form_Resize()
    Dim i As Integer
    On Error GoTo uerror
    For i = 0 To Controls.Count - 1
    Controls(i).Move ap(i).lp * Me.ScaleWidth, ap(i).tp * Me.ScaleHeight, ap(i).wp * Me.ScaleWidth, ap(i).hp * Me.ScaleHeight
    Next i
    Me.PaintPicture Me.Picture, 0, 0, Me.ScaleWidth, Me.ScaleHeight        '背景图片自动适应窗口
    Exit Sub
    uerror:
    Resume Next
    
    End Sub
    
    
    Private Sub cmdInquiry_Click()
           Dim mrc As ADODB.Recordset
           Dim MsgText As String
           Dim txtSQL As String
           
           
           '判断输入卡号是否为空
           If Not Testtxt(txtCardNo.Text) Then
                 MsgBox "您还没有输入卡号!", vbOKOnly + vbExclamation, "温馨提示"
                 Exit Sub
           End If
         
           
           '判断输入卡号是否存在
           txtSQL = "select * from student_info where cardno = '" & txtCardNo.Text & "'"
           Set mrc = ExecuteSQL(txtSQL, MsgText)
           If mrc.EOF = True Then
                 MsgBox "此卡号不存在,请您重新输入!", vbOKOnly + vbExclamation, "温馨提示"
                 txtCardNo.SetFocus
                 txtCardNo.Text = ""
                 mrc.Close
                 Exit Sub
           End If
           
           
           '连接Line表,将数据调用至窗体表格上
           txtSQL = "select * from Line_info where cardno = '" & txtCardNo.Text & "'"
           Set mrc = ExecuteSQL(txtSQL, MsgText)
           With myFlexgrid
                 .rows = 1
                 .CellAlignment = 4                'CellAlignment该属性返回或设置的数值确定了一个单元格或被选定的多个单元格所在区域的水平和垂直对齐方式。
                 .TextMatrix(0, 0) = "卡号"
                 .TextMatrix(0, 1) = "姓名"
                 .TextMatrix(0, 2) = "上机日期"
                 .TextMatrix(0, 3) = "上机时间"
                 .TextMatrix(0, 4) = "下机日期"
                 .TextMatrix(0, 5) = "下机时间"
                 .TextMatrix(0, 6) = "消费金额"
                 .TextMatrix(0, 7) = "余额"
                 .TextMatrix(0, 8) = "备注"
                 
                 
                 '判断是否移动到数据集对象的最后一条记录
                 Do While Not mrc.EOF
                 .rows = .rows + 1
                 .CellAlignment = 4
                 .TextMatrix(.rows - 1, 0) = mrc.Fields(1)
                 .TextMatrix(.rows - 1, 1) = mrc.Fields(3)
                 .TextMatrix(.rows - 1, 2) = mrc.Fields(6)
                 .TextMatrix(.rows - 1, 3) = mrc.Fields(7)
                 .TextMatrix(.rows - 1, 4) = mrc.Fields(8) & ""
                 .TextMatrix(.rows - 1, 5) = mrc.Fields(9) & ""
                 .TextMatrix(.rows - 1, 6) = mrc.Fields(11) & ""
                 .TextMatrix(.rows - 1, 7) = mrc.Fields(12) & ""
                 .TextMatrix(.rows - 1, 8) = mrc.Fields(13) & ""
                  mrc.MoveNext   '移动到下一条记录
              Loop
    End With
              mrc.Close    '关闭数据集对象
           
    End Sub
    
    
    '导出为Excel表格
    Private Sub cmdExportExcel_Click()
    
        Dim ExcelApp As Excel.Application               '定义Excel对象
    
        Dim ExcelBook As Excel.Workbook                  '定义Excel的工作簿
    
        Dim ExcelSheet As Excel.Worksheet                '定义Excel的表
    
        Dim ExcelRange As Excel.Range
        
        Dim rows As Integer         '总行数
        
        Dim cols As Integer         '总列数
        
        '首先判断myflexgrid表中是否有数据存在可供导出
        If myFlexgrid.rows <= 2 Then
             MsgBox "没有数据可导出!", vbOKOnly + vbExclamation, "导出"
            
      Else
    
             MsgBox "正在把数据导出到EXCLE里,请稍等.......", vbOKOnly + vbExclamation, "导出"
             Screen.MousePointer = vbHourglass
      
    
    
    
        Dim i As Integer       '定义横坐标
    
        Dim j As Integer       '定义纵坐标
    
         
    
        Set ExcelApp = CreateObject("Excel.application")    '创建Excel应用程序对象,并使其实例化
    
        Set ExcelBook = ExcelApp.Workbooks.Add                 '加载工作簿
    
        Set ExcelSheet = ExcelBook.Worksheets(1)               '创建一个工作表
        
        ExcelApp.Caption = "学生上机记录"             '设置Excel的标题栏
         
    
        DoEvents           '转让控制权,以便让操作系统处理其它的事件
    
        With myFlexgrid      '将flexgrid控件中内容导入Excel表格中
    
            For i = 0 To .rows - 1         '遍历所有的行
    
                For j = 0 To .cols - 1     '遍历所有的列
    
                    DoEvents                 '转让控制权,以便让操作系统处理其它的事件
    
                    ExcelApp.ActiveSheet.Cells(i + 1, j + 1) = .TextMatrix(i, j)   '创建新的单元格,并添加flexgrid中的内容
    
                Next j
    
            Next i
    
             
    
        End With
    
        
    
        MsgBox "导出完成!", vbOKOnly + vbExclamation, "提示"              'Excel表格成功导出提示信息
        
        
        '释放对象,显示Excel表格
        ExcelApp.Visible = True
        Set ExcelApp = Nothing
        Set ExcelBook = Nothing
        
        '加入下面这句是防止在导出Excel表格后鼠标箭头一直转圈圈
        Screen.MousePointer = 0    'Screen.MousePointer = vbDefault  'vbDefault 0 (缺省值)形状由对象决定。
        Exit Sub
        
    Err_proc:
        Screen.MousePointer = vbDefault
        MsgBox "导出失败,请确认您的电脑已安装Excel,或是否安装正确!", vbOKOnly + vbExclamation, "警告"
       End If
    
    End Sub
    
    '输入卡号框只能为数字或者是大小写字母,且可以退格键使用
    Private Sub txtCardNo_KeyPress(KeyAscii As Integer)
    Dim cTemp As String
        cTemp = "#$%^&*"   '禁止输入的字符
        If InStr(1, cTemp, Chr(KeyAscii)) <> 0 Then
            KeyAscii = 0
        End If
    Select Case KeyAscii
        Case 48 To 57 '只能输入数字
        Case 65 To 90 '只能输入大小写字母
        Case 97 To 122 ' 只能输入退格
        Case 8
        Case Else
        KeyAscii = 0
    End Select
    End Sub
    
    
    
    
    

            其中,学生充值记录查询这个窗体和学生查看上机记录窗体都差不多,唯一不一样的就是连接的表不一样罢了,但代码格式方面还是差不多的,我就不一一做解释了。

    机房的学生查看上机记录窗体就这样了,如果有什么地方需要改进或者有需要优化的部分,欢迎大家指点一二。

    展开全文
  •  本书非常适合Java Web的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合Java Web程序员参考、查阅。 目 录 第1篇 基础篇 第1章 开发环境搭建 1.1 JDK开发工具包 实例001 JDK的下载 实例002 ...
  •  本书非常适合Java Web的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合Java Web程序员参考、查阅。 目 录 第1篇 基础篇 第1章 开发环境搭建 1.1 JDK开发工具包 实例001 JDK的下载 实例002 ...
  • 前端时间公司有个项目,需求大致是这样的——根据word模版,生成带学生照片的信息表格。如果是批量打印,则生成一个word文档,每个学生占用一页。 在实现时,参考了两位老哥的代码: 使用poi根据模版生成word文档...

    前端时间公司有个项目,需求大致是这样的——根据word模版,生成带学生照片的信息表格。如果是批量打印,则生成一个word文档,每个学生占用一页。

    在实现时,参考了两位老哥的代码:

    使用poi根据模版生成word文档,支持插入数据和图片

    poi替换word模板内容 并且合并生成多页的word 实现分页

    先上工具类的代码:

    import org.apache.poi.xwpf.usermodel.*;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.*;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class WordUtils {
        /**
         * 根据模板生成word
         *
         * @param path      模板的路径
         * @param params    需要替换的参数
         * @param tableList 需要插入的参数
         * @param fileName  生成word文件的文件名
         * @param response
         */
        public void getWord(String path, Map<String, Object> params, List<String[]> tableList, String fileName, HttpServletResponse response) throws Exception {
            File file = new File(path);
            InputStream is = new FileInputStream(file);
            CustomXWPFDocument doc = new CustomXWPFDocument(is);
            this.replaceInPara(doc, doc, params);    //替换文本里面的变量
            this.replaceInTable(doc, doc, params, tableList); //替换表格里面的变量
            OutputStream os = response.getOutputStream();
            response.setHeader("Content-disposition", "attachment; filename=" + fileName);
            doc.write(os);
            this.close(os);
            this.close(is);
        }
    
        /**
         * 替换段落里面的变量
         *
         * @param doc    要替换的文档
         * @param params 参数
         */
        public void replaceInPara(CustomXWPFDocument firstDoc, CustomXWPFDocument doc, Map<String, Object> params) {
            Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();
            XWPFParagraph para;
            while (iterator.hasNext()) {
                para = iterator.next();
                this.replaceInPara(firstDoc, para, params, doc);
            }
        }
    
        /**
         * 替换段落里面的变量
         *
         * @param para   要替换的段落
         * @param params 参数
         */
        private void replaceInPara(CustomXWPFDocument firstDoc, XWPFParagraph para, Map<String, Object> params, CustomXWPFDocument doc) {
            List<XWPFRun> runs;
            Matcher matcher;
            if (this.matcher(para.getParagraphText()).find()) {
                runs = para.getRuns();
                int start = -1;
                int end = -1;
                String str = "";
                for (int i = 0; i < runs.size(); i++) {
                    XWPFRun run = runs.get(i);
                    String runText = run.toString();
                    if ('$' == runText.charAt(0) && '{' == runText.charAt(1)) {
                        start = i;
                    }
                    if ((start != -1)) {
                        str += runText;
                    }
                    if ('}' == runText.charAt(runText.length() - 1)) {
                        if (start != -1) {
                            end = i;
                            break;
                        }
                    }
                }
    
                for (int i = start; i <= end; i++) {
                    para.removeRun(i);
                    i--;
                    end--;
                }
    
                for (Map.Entry<String, Object> entry : params.entrySet()) {
                    String key = entry.getKey();
                    if (str.indexOf(key) != -1) {
                        Object value = entry.getValue();
                        if (value instanceof String) {
                            str = str.replace(key, value.toString());
                            para.createRun().setText(str, 0);
                            break;
                        } else if (value instanceof Map) {
                            str = str.replace(key, "");
                            Map pic = (Map) value;
                            int width = Integer.parseInt(pic.get("width").toString());
                            int height = Integer.parseInt(pic.get("height").toString());
                            int picType = getPictureType(pic.get("type").toString());
                            byte[] byteArray = (byte[]) pic.get("content");
                            ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);
                            try {
                                String ind = firstDoc.addPictureData(byteInputStream, picType);
                                int id = firstDoc.getNextPicNameNumber(picType);
                                firstDoc.createPicture(ind, id, width, height, para);
                                // 由于图片重复则显示错误,重写create方法
                                // firstDoc.addPictureData(byteInputStream, picType);
                                // firstDoc.createPicture(firstDoc.getAllPictures().size() - 1, width, height, para, firstDoc);
                                para.createRun().setText(str, 0);
                                break;
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }
    
    
        /**
         * 为表格插入数据,行数不够添加新行
         *
         * @param table     需要插入数据的表格
         * @param tableList 插入数据集合
         */
        private static void insertTable(XWPFTable table, List<String[]> tableList) {
            //创建行,根据需要插入的数据添加新行,不处理表头
            for (int i = 0; i < tableList.size(); i++) {
                XWPFTableRow row = table.createRow();
            }
            //遍历表格插入数据
            List<XWPFTableRow> rows = table.getRows();
            int length = table.getRows().size();
            for (int i = 1; i < length - 1; i++) {
                XWPFTableRow newRow = table.getRow(i);
                List<XWPFTableCell> cells = newRow.getTableCells();
                for (int j = 0; j < cells.size(); j++) {
                    XWPFTableCell cell = cells.get(j);
                    String s = tableList.get(i - 1)[j];
                    cell.setText(s);
                }
            }
        }
    
        /**
         * 替换表格里面的变量
         *
         * @param doc    要替换的文档
         * @param params 参数
         */
        public void replaceInTable(CustomXWPFDocument firstDoc, CustomXWPFDocument doc, Map<String, Object> params, List<String[]> tableList) {
            Iterator<XWPFTable> iterator = doc.getTablesIterator();
            XWPFTable table;
            List<XWPFTableRow> rows;
            List<XWPFTableCell> cells;
            List<XWPFParagraph> paras;
            while (iterator.hasNext()) {
                table = iterator.next();
                if (table.getRows().size() > 1) {
                    //判断表格是需要替换还是需要插入,判断逻辑有$为替换,表格无$为插入
                    if (this.matcher(table.getText()).find()) {
                        rows = table.getRows();
                        for (XWPFTableRow row : rows) {
                            cells = row.getTableCells();
                            for (XWPFTableCell cell : cells) {
                                paras = cell.getParagraphs();
                                for (XWPFParagraph para : paras) {
                                    this.replaceInPara(firstDoc, para, params, doc);
                                }
                            }
                        }
                    } else {
                        insertTable(table, tableList);  //插入数据
                    }
                }
            }
        }
    
        /**
         * 正则匹配字符串
         *
         * @param str
         * @return
         */
        private Matcher matcher(String str) {
            Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);
            Matcher matcher = pattern.matcher(str);
            return matcher;
        }
    
        /**
         * 根据图片类型,取得对应的图片类型代码
         *
         * @param picType
         * @return int
         */
        public int getPictureType(String picType) {
            int res = CustomXWPFDocument.PICTURE_TYPE_PICT;
            if (picType != null) {
                if (picType.equalsIgnoreCase("png")) {
                    res = CustomXWPFDocument.PICTURE_TYPE_PNG;
                } else if (picType.equalsIgnoreCase("dib")) {
                    res = CustomXWPFDocument.PICTURE_TYPE_DIB;
                } else if (picType.equalsIgnoreCase("emf")) {
                    res = CustomXWPFDocument.PICTURE_TYPE_EMF;
                } else if (picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")) {
                    res = CustomXWPFDocument.PICTURE_TYPE_JPEG;
                } else if (picType.equalsIgnoreCase("wmf")) {
                    res = CustomXWPFDocument.PICTURE_TYPE_WMF;
                }
            }
            return res;
        }
    
        /**
         * 将输入流中的数据写入字节数组
         *
         * @param in
         * @return
         */
        public static byte[] inputStream2ByteArray(InputStream in, boolean isClose) {
            byte[] byteArray = null;
            try {
                int total = in.available();
                byteArray = new byte[total];
                in.read(byteArray);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (isClose) {
                    try {
                        in.close();
                    } catch (Exception e2) {
                        e2.getStackTrace();
                    }
                }
            }
            return byteArray;
        }
    
        /**
         * 关闭输入流
         *
         * @param is
         */
        public void close(InputStream is) {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 关闭输出流
         *
         * @param os
         */
        public void close(OutputStream os) {
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * @Description: 保存图片(用来插入)
         * @Param:
         * @return:
         * @Author: lgc
         * @Date: 2019/4/24
         */
        public byte[] readInputStream(InputStream inStream) throws Exception {
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            //创建一个Buffer字符串
            byte[] buffer = new byte[1024];
            //每次读取的字符串长度,如果为-1,代表全部读取完毕
            int len = 0;
            //使用一个输入流从buffer里把数据读取出来
            while ((len = inStream.read(buffer)) != -1) {
                //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
                outStream.write(buffer, 0, len);
            }
            //关闭输入流
            inStream.close();
            //把outStream里的数据写入内存
            return outStream.toByteArray();
        }
    }

    下面是很多人都提到的poi无法显示bug的解决:

    import org.apache.poi.openxml4j.opc.OPCPackage;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.xmlbeans.XmlException;
    import org.apache.xmlbeans.XmlToken;
    import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
    import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
    import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    public class CustomXWPFDocument extends XWPFDocument {
    
        public CustomXWPFDocument(InputStream in) throws IOException {
            super(in);
        }
    
        public CustomXWPFDocument() {
            super();
        }
    
        public CustomXWPFDocument(OPCPackage pkg) throws IOException {
            super(pkg);
        }
    
        /**
         * @param id
         * @param width     宽
         * @param height    高
         * @param paragraph 段落
         */
        public void createPicture(int id, int width, int height, XWPFParagraph paragraph, CustomXWPFDocument doc) {
            final int EMU = 9525;
            width *= EMU;
            height *= EMU;
            String blipId = doc.getAllPictures().get(id).getPackageRelationship().getId();
            CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();
            String picXml = ""
                    + "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"
                    + "   <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"
                    + "      <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"
                    + "         <pic:nvPicPr>" + "            <pic:cNvPr id=\""
                    + id
                    + "\" name=\"Generated\"/>"
                    + "            <pic:cNvPicPr/>"
                    + "         </pic:nvPicPr>"
                    + "         <pic:blipFill>"
                    + "            <a:blip r:embed=\""
                    + blipId
                    + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"
                    + "            <a:stretch>"
                    + "               <a:fillRect/>"
                    + "            </a:stretch>"
                    + "         </pic:blipFill>"
                    + "         <pic:spPr>"
                    + "            <a:xfrm>"
                    + "               <a:off x=\"0\" y=\"0\"/>"
                    + "               <a:ext cx=\""
                    + width
                    + "\" cy=\""
                    + height
                    + "\"/>"
                    + "            </a:xfrm>"
                    + "            <a:prstGeom prst=\"rect\">"
                    + "               <a:avLst/>"
                    + "            </a:prstGeom>"
                    + "         </pic:spPr>"
                    + "      </pic:pic>"
                    + "   </a:graphicData>" + "</a:graphic>";
    
            inline.addNewGraphic().addNewGraphicData();
            XmlToken xmlToken = null;
            try {
                xmlToken = XmlToken.Factory.parse(picXml);
            } catch (XmlException xe) {
                xe.printStackTrace();
            }
            inline.set(xmlToken);
    
            CTPositiveSize2D extent = inline.addNewExtent();
            extent.setCx(width);
            extent.setCy(height);
    
            CTNonVisualDrawingProps docPr = inline.addNewDocPr();
            docPr.setId(id);
            docPr.setName("图片" + blipId);
            docPr.setDescr("头像");
        }
    
        public void createPicture(String blipId, int id, int width, int height, XWPFParagraph paragraph) {
            final int EMU = 9525;
            width *= EMU;
            height *= EMU;
            //String blipId = getAllPictures().get(id).getPackageRelationship().getId();
            CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();
    
            String picXml = "" +
                    "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">" +
                    "   <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" +
                    "      <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" +
                    "         <pic:nvPicPr>" +
                    "            <pic:cNvPr id=\"" + id + "\" name=\"Generated\"/>" +
                    "            <pic:cNvPicPr/>" +
                    "         </pic:nvPicPr>" +
                    "         <pic:blipFill>" +
                    "            <a:blip r:embed=\"" + blipId + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>" +
                    "            <a:stretch>" +
                    "               <a:fillRect/>" +
                    "            </a:stretch>" +
                    "         </pic:blipFill>" +
                    "         <pic:spPr>" +
                    "            <a:xfrm>" +
                    "               <a:off x=\"0\" y=\"0\"/>" +
                    "               <a:ext cx=\"" + width + "\" cy=\"" + height + "\"/>" +
                    "            </a:xfrm>" +
                    "            <a:prstGeom prst=\"rect\">" +
                    "               <a:avLst/>" +
                    "            </a:prstGeom>" +
                    "         </pic:spPr>" +
                    "      </pic:pic>" +
                    "   </a:graphicData>" +
                    "</a:graphic>";
    
            inline.addNewGraphic().addNewGraphicData();
            XmlToken xmlToken = null;
            try {
                xmlToken = XmlToken.Factory.parse(picXml);
            } catch (XmlException xe) {
                xe.printStackTrace();
            }
            inline.set(xmlToken);
    
            CTPositiveSize2D extent = inline.addNewExtent();
            extent.setCx(width);
            extent.setCy(height);
    
            CTNonVisualDrawingProps docPr = inline.addNewDocPr();
            docPr.setId(id);
            docPr.setName("图片" + id);
            docPr.setDescr("头像");
        }
    }

    最后是我自己的实现类代码:

    import com.edu.model.InterviewRoomPlay;
    import com.edu.model.InterviewRoomUser;
    import com.edu.service.EduInterviewService;
    import com.yz.controller.BaseController;
    import com.yz.service.annotation.LoginRequired;
    import org.apache.commons.lang.StringUtils;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.xmlbeans.XmlOptions;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import javax.annotation.Resource;
    import javax.imageio.ImageIO;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.awt.image.BufferedImage;
    import java.io.*;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.text.SimpleDateFormat;
    import java.util.*;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    
    
    @Controller
    @RequestMapping("/exportWord")
    @LoginRequired
    public class ExportWordController extends BaseController {
    
        @Resource
        private EduInterviewService service;
    
        private String ImageHandle = "?imageView2/2/w/120/h/141/q/80";
    
        @RequestMapping("/batch")
        @ResponseBody
        public void batch(@RequestParam Integer playId, @RequestParam Integer schoolId,
                          HttpServletResponse response, HttpSession session) throws Exception {
            //创建压缩包位置
            File fileZip = new File("/wordZip");
            if (!fileZip.exists()) {
                fileZip.mkdirs();
            }
            //获得面试间和场次名称
            InterviewRoomPlay play = service.getPlayById(playId);
            String wordName = play.getConfigName() + "-" + play.getName() + "的学生打印表";
            String filesPath = "/wordZip/" + new Date().getTime();
            //合并模板的个数就是每次要解析多少个当前的模板 ,那么就需要首先定义一个集合
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            List<InterviewRoomUser> userList = service.getUserByPlayId(playId);
            //我用的是2007版本以后poi对word进行解析的docx
            //首先定义一个XWPFDocument 集合 这个对象可以进行word 解析 合并 还有下载都离不开这个对象
            List<CustomXWPFDocument> xwpfDocuments = new ArrayList<>();
            //由于合并时将所有图片都存在第一个doc里面,所以定义方便图片传值
            CustomXWPFDocument firstDoc = null;
            //判断需要的参数
            Integer sex;
            Date playStartTime;
            String filePath = session.getServletContext().getRealPath("/") + "doc/interviewDoc/" + schoolId + ".docx";
            //期次我们先解析word模板 替换其中的占位符
            int index = 0;
            Integer handleTime = 1;
            for (InterviewRoomUser user : userList) {
                WordUtils wordUtils = new WordUtils();
                Map<String, Object> params = new HashMap<>();
                playStartTime = user.getPlayStartTime();
                sex = user.getSex();
                String headImage = user.getHeadImage();
                if (StringUtils.isNotEmpty(headImage)) {
                    //替换的图片
                    String headimg = session.getServletContext().getRealPath("/") + "doc/interviewDoc/head.png";
                    //new一个URL对象
                    URL url = new URL(headImage + ImageHandle);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(5 * 1000);
                    InputStream inStream = conn.getInputStream();
                    byte[] data = wordUtils.readInputStream(inStream);
                    File imageFile = new File(headimg);
                    FileOutputStream outStream = new FileOutputStream(imageFile);
                    outStream.write(data);
                    outStream.close();
                    //图片
                    InputStream murl = new URL(headImage + ImageHandle).openStream();
                    BufferedImage sourceImg = ImageIO.read(murl);
                    Map<String, Object> header = new HashMap<>();
                    header.put("width", sourceImg.getWidth());
                    header.put("height", sourceImg.getHeight());
                    header.put("type", wordUtils.getPictureType(headimg));
                    header.put("content", wordUtils.inputStream2ByteArray(new FileInputStream(headimg), true));
                    params.put("${headImage}", header);
                } else {
                    params.put("${headImage}", "");
                }
                params.put("${name}", user.getName());
                String idcard = user.getIdcard();
                params.put("${idcard}", idcard);
                if (sex != null) {
                    if (sex == 1) {
                        params.put("${sex}", "男");
                    } else if (sex == 2) {
                        params.put("${sex}", "女");
                    } else {
                        params.put("${sex}", "");
                    }
                } else {
                    if (!StringUtils.isEmpty(idcard)) {
                        params.put("${sex}", checkSex(idcard));
                    } else {
                        params.put("${sex}", "");
                    }
                }
                params.put("${phone}", user.getPhone());
                params.put("${fromSchool}", user.getFromSchool());
                params.put("${fromSpecialty}", user.getFromSpecialty());
                params.put("${specialtyName}", user.getSpecialtyName());
                if (playStartTime != null) {
                    params.put("${playStartTime}", sdf.format(playStartTime));
                } else {
                    params.put("${playStartTime}", "");
                }
                params.put("${playName}", user.getPlayName());
                //返回一个新的xwpfDocument对象
                File file = new File(filePath);
                InputStream is = new FileInputStream(file);
                CustomXWPFDocument doc = new CustomXWPFDocument(is);
                if (index == 0 || (index != 1 && index % 49 == 1)) {
                    firstDoc = doc;
                }
                wordUtils.replaceInPara(firstDoc, doc, params);
                wordUtils.replaceInTable(firstDoc, doc, params, null);
                xwpfDocuments.add(doc);
                is.close();
                //每50条输出一次
                if (userList.size() > 50 && index != 0 && (index == userList.size() - 1 || index % 49 == 0)) {
                    File files = new File(filesPath);
                    if (!files.exists()) {
                        files.mkdirs();
                    }
                    //这样第一步将所有word内容替换之后生成多个   xwpfDocument
                    //现在将多个xwpfDocument 进行合并 追加 生成word文件
                    CustomXWPFDocument xwpfDocument = xwpfDocuments.get(0);
                    for (int i = 0; i < xwpfDocuments.size(); i++) {
                        //每次的追加为了避免样式和格式混乱 加上分页符
                        //当是只有一条数据的时候 直接输出
                        if (i == 0) {
                            xwpfDocument = xwpfDocuments.get(0);
                            continue;
                        } else {
                            //当存在多条时候
                            xwpfDocument = mergeWord(xwpfDocument, xwpfDocuments.get(i));
                        }
                    }
                    //合并之后返回XWPFDocument对象 写出就可以了
                    String fileName = wordName + handleTime + ".docx";
                    FileOutputStream fout = new FileOutputStream(filesPath + "/" + new File(fileName));
                    xwpfDocument.write(fout);
                    fout.close();
                    handleTime++;
    
                    xwpfDocuments.clear();
                }
                index++;
            }
            if (userList.size() > 50) {
                createZipPath(filesPath, response, play.getConfigName() + "-" + play.getName() + "的学生打印表");
                File files = new File(filesPath);
                if (files.exists()) {
                    delFolder(files.getPath());
                }
            } else {
                if (xwpfDocuments.size() > 0) {
                    //这样第一步将所有word内容替换之后生成多个   xwpfDocument
                    //现在将多个xwpfDocument 进行合并 追加 生成word文件
                    CustomXWPFDocument xwpfDocument = xwpfDocuments.get(0);
                    for (int i = 0; i < xwpfDocuments.size(); i++) {
                        //每次的追加为了避免样式和格式混乱 加上分页符
                        //当是只有一条数据的时候 直接输出
                        if (i == 0) {
                            xwpfDocument = xwpfDocuments.get(0);
                            continue;
                        } else {
                            //当存在多条时候
                            xwpfDocument = mergeWord(xwpfDocument, xwpfDocuments.get(i));
                        }
                    }
                    //合并之后返回XWPFDocument对象 写出就可以了
                    OutputStream os = response.getOutputStream();
                    String fileName = new String((wordName + ".docx").getBytes("UTF-8"), "iso-8859-1");
                    response.setHeader("Content-disposition", "attachment; filename=" + fileName);
                    xwpfDocument.write(os);
                    os.close();
                }
            }
        }
    
        //两个对象进行追加
        public CustomXWPFDocument mergeWord(CustomXWPFDocument document, CustomXWPFDocument doucDocument2) throws Exception {
            CustomXWPFDocument src1Document = document;
            XWPFParagraph p = src1Document.createParagraph();
            //设置分页符
            p.setPageBreak(true);
            CTBody src1Body = src1Document.getDocument().getBody();
            CustomXWPFDocument src2Document = doucDocument2;
            CTBody src2Body = src2Document.getDocument().getBody();
            XWPFParagraph p2 = src2Document.createParagraph();
            XmlOptions optionsOuter = new XmlOptions();
            optionsOuter.setSaveOuter();
            String appendString = src2Body.xmlText(optionsOuter);
            String srcString = src1Body.xmlText();
            String prefix = srcString.substring(0, srcString.indexOf(">") + 1);
            String mainPart = srcString.substring(srcString.indexOf(">") + 1, srcString.lastIndexOf("<"));
            String sufix = srcString.substring(srcString.lastIndexOf("<"));
            String addPart = appendString.substring(appendString.indexOf(">") + 1, appendString.lastIndexOf("<"));
            CTBody makeBody = CTBody.Factory.parse(prefix + mainPart + addPart + sufix);
            src1Body.set(makeBody);
            return src1Document;
        }
    
        //压缩输出
        public static void createZipPath(String path, HttpServletResponse response, String zipName) throws IOException {
            ZipOutputStream zipOutputStream = null;
            OutputStream output = response.getOutputStream();
            response.reset();
            String fileNameZip = new String((zipName + ".zip").getBytes("UTF-8"), "iso-8859-1");
            response.setHeader("Content-disposition", "attachment; filename=" + fileNameZip);
            response.setContentType("application/msword");
            zipOutputStream = new ZipOutputStream(output);
            File[] files = new File(path).listFiles();
            FileInputStream fileInputStream = null;
            byte[] buf = new byte[1024];
            int len = 0;
            if (files != null && files.length > 0) {
                for (File wordFile : files) {
                    String fileName = wordFile.getName();
                    fileInputStream = new FileInputStream(wordFile);
                    //放入压缩zip包中;
                    zipOutputStream.putNextEntry(new ZipEntry(fileName));
                    //读取文件;
                    while ((len = fileInputStream.read(buf)) > 0) {
                        zipOutputStream.write(buf, 0, len);
                    }
                    //关闭;
                    zipOutputStream.closeEntry();
                    if (fileInputStream != null) {
                        fileInputStream.close();
                    }
                }
            }
    
            if (zipOutputStream != null) {
                zipOutputStream.close();
            }
        }
    
        /***
         * 删除文件夹
         *
         * @param folderPath 文件夹完整绝对路径
         */
        public static void delFolder(String folderPath) {
            try {
                delAllFile(folderPath); // 删除完里面所有内容
                String filePath = folderPath;
                filePath = filePath.toString();
                java.io.File myFilePath = new java.io.File(filePath);
                myFilePath.delete(); // 删除空文件夹
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /***
         * 删除指定文件夹下所有文件
         *
         * @param path 文件夹完整绝对路径
         * @return
         */
        public static boolean delAllFile(String path) {
            boolean flag = false;
            File file = new File(path);
            if (!file.exists()) {
                return flag;
            }
            if (!file.isDirectory()) {
                return flag;
            }
            String[] tempList = file.list();
            File temp = null;
            for (int i = 0; i < tempList.length; i++) {
                if (path.endsWith(File.separator)) {
                    temp = new File(path + tempList[i]);
                } else {
                    temp = new File(path + File.separator + tempList[i]);
                }
                if (temp.isFile()) {
                    temp.delete();
                }
                if (temp.isDirectory()) {
                    delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件
                    delFolder(path + "/" + tempList[i]);// 再删除空文件夹
                    flag = true;
                }
            }
            return flag;
        }
    
        public String checkSex(String idcard) {
            Integer sex = 0;
            if (idcard.length() == 15) {
                //15位身份证最后一位奇男偶女
                sex = oddOrEven(Integer.valueOf(idcard.substring(idcard.length() - 1, idcard.length())));
            } else if (idcard.length() == 18) {
                //18位身份证第17位奇男偶女
                sex = oddOrEven(Integer.valueOf(idcard.substring(idcard.length() - 2, idcard.length() - 1)));
            } else {
                return "";
            }
            if (sex == 1) {
                return "男";
            } else if (sex == 2) {
                return "女";
            }
            return "";
        }
    
        //判断奇偶数
        public Integer oddOrEven(int a) {
            if ((a & 1) == 1) {
                return 1;
            } else {
                return 2;
            }
        }
    }

    还有就是poi的版本(版本不重要,只要不是太老的就行):

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.9</version>
    </dependency>

    下面是一些详细个人的代码说明:

      由于我在多次生成时发现,poi的图片处理是根据模版存放的。也就是说,当CustomXWPFDocument的对象不一样时,每个对象的第一张图片的rid都是rid8(我也没有细究为啥是从8开始),但是由于后期我需要将多个CustomXWPFDocument整合成为一个输出,就造成明明图片的对象不一样,但是由于除了第一个CustomXWPFDocument的图片对象外,其他的图片并没有将数据代入第一个CustomXWPFDocument,但是图片对应的rid又能找到对应对象,所以模版的图片就成了同一张。所有后续拼接的图片根据id只能在第一个中找,一旦没找到,就会造成图片不显示,这也就是我为什么对每次输出循环的第一个CustomXWPFDocument进行重复添加图片的操作。

      而两个createPicture的区别在于,当poi遇到完全一样的照片时,将不会执行重复写入图片数据的操作,而是使用相同的rid以作对应。我所使用的那个,可以将图片对应的rid返回,这样就不会造成图片错乱。而注释掉的那个,当发现图片重复,返回的只有CustomXWPFDocument中最后一个图片的信息,这样当重复图片不是连续时,图片的显示就出错了。

      在实际操作中,我将50个及以下的操作选择用单个word直接输出,而50个以上则分开用zip输出。原因在于,在实际使用时,我发现当将多个CustomXWPFDocument合并形成一个时,数据量过大会导致卡死,影响后续的输出。在我的项目中,70个以上处理速度开始变慢翻倍,大概在76个时直接卡死。每个人可能因模版的大小及复杂程度有所不同。

      当模版中有图片时,本地图片可以直接获取文件信息。链接图片则需要访问链接,并将其写入本地的一个文件中,以便直接操作使用。

       以上皆为个人理解和查询结果,欢迎批评指正~~

     

    转载于:https://www.cnblogs.com/ssbfs/p/11251564.html

    展开全文
  • 系统对于教师的教学水平以及综合能力,督导需要得到一个详细的反馈,而这些反馈信息重要通过学生评价得出,而传统的方式存在信息管理混乱,时间界限不清晰,资料容易遗失,存档不便等诸多不利因素,因此开发一个能让...
  • 工人/学生通过我们的自定义表格将自己加入感兴趣的工作领域。 内容 关于我们的产品 所用技术 产品工作链接: : 产品图片 目标观众 产品相关视频 产品预告片: : 产品现场演示: : 产品推广 开发者
  • 在对他们的论文进行审阅时,经常遇到图片表格多余需要删除或者是位置不合理,调整一下顺序。这个时候就会发现,学生们都是在一个一个重新修改,既麻烦又浪费时间。修改的次数多时,竟然有学生发脾气,嫌不...
  • 在Office以往的版本中也有OneNote的身影,不过那时它还不被重视...据说:这款软件风靡美国大学,那里的大学生上课、业余时间都开着,它最大的好处是用着方面,想怎么编辑就怎么来,音乐、图片、视频、表格,这些都不...
  • (3) 在线答疑/留言模块:查看/回复/删除留言,在线答疑/提问,留言对象可为老师-老师,老师-学生学生-学生,支持留言群发,留言内容可为文字,图表,图片,甚至可以是多媒体影片。 (4) 学生论文选题模块:选择指导...
  • (3) 在线答疑/留言模块:查看/回复/删除留言,在线答疑/提问,留言对象可为老师-老师,老师-学生学生-学生,支持留言群发,留言内容可为文字,图表,图片,甚至可以是多媒体影片。 (4) 学生论文选题模块:...
  • 整个项目统筹考虑实训的设计,循序渐进、逐步完善,着重培养学生独立思考问题和主动解决问题的能力,突出了职业技术教育的特色。 《网页设计与制作:Flash Dreamweaver Firework(计算机应用与软件技术专业)》适合...
  • Excel新增工具集

    2011-12-20 09:30:27
    用极短时间,在《欧赔走势》与《欧赔比较》等工作表中对各参数进行有机组合与比较分析,给玩家展示出各时段的赔率规律,是足彩必赢的可靠工具。 2、okooo彩票网北单胜平负分析:将okooo彩票网上的模拟庄家盈亏和...
  •  本书非常适合Java的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合Java程序员参考、查阅。 目 录 第1篇 图形图像篇 第1章 Java图形与文本 2 1.1 绘制图形和文本 3 实例001 绘制直线 3 实例002 ...
  •  本书非常适合Java的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合Java程序员参考、查阅。 目 录 第1篇 图形图像篇 第1章 Java图形与文本 2 1.1 绘制图形和文本 3 实例001 绘制直线 3 实例002 ...
  •  本书非常适合Java的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合Java程序员参考、查阅。 目 录 第1篇 图形图像篇 第1章 Java图形与文本 2 1.1 绘制图形和文本 3 实例001 绘制直线 3 实例002 ...
  •  本书非常适合Java的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合Java程序员参考、查阅。 目 录 第1篇 图形图像篇 第1章 Java图形与文本 2 1.1 绘制图形和文本 3 实例001 绘制直线 3 实例002 ...
  • 出版社: 武汉大学出版社书号: 9787307040915发行时间: 2004年04月 地区: 大陆 语言: 简体中文 简介: 内容简介: 本书由五章构成。第一章计算机基本知识和 Windows98;第二章用 Word制作教案,介绍Office Word 的...
  • 2.5 用表格定位搜狐邮箱的用户登录界面 32 2.6 使用CSS 实现搜狐邮箱的用户登录 41 2.6.1 绝对定位 41 2.6.2 div 43 2.6.3 级联样式 44 2.7 在网页上显示时间 49 2.7.1 为什么要学习JavaScript 49 2.7.2 ...
  • 10 3 2 设置界面背景图片 10 3 3 设置管理账号密码 10 3 4 JTabbedPane类的使用 10 3 5 初始化ComboBox组件的条目 10 3 6 根据年份和月份设置日期组合框的条目 10 3 7 系统自动生成订单号 10 3 8 典型用例的实现 ...
  • 实例202 计算程序运行时间 实例203 从控制台输入密码 9.4 Math类的使用 实例204 角度和弧度的转换 实例205 三角函数的使用 实例206 反三角函数的使用 实例207 双曲函数的使用 实例208 指数与对数运算 9.5 ...
  • 实例202 计算程序运行时间 实例203 从控制台输入密码 9.4 Math类的使用 实例204 角度和弧度的转换 实例205 三角函数的使用 实例206 反三角函数的使用 实例207 双曲函数的使用 实例208 指数与对数运算 9.5 ...
  • 实例202 计算程序运行时间 实例203 从控制台输入密码 9.4 Math类的使用 实例204 角度和弧度的转换 实例205 三角函数的使用 实例206 反三角函数的使用 实例207 双曲函数的使用 实例208 指数与对数运算 9.5 ...
  • 实例202 计算程序运行时间 实例203 从控制台输入密码 9.4 Math类的使用 实例204 角度和弧度的转换 实例205 三角函数的使用 实例206 反三角函数的使用 实例207 双曲函数的使用 实例208 指数与对数运算 9.5 ...
  • 实例202 计算程序运行时间 实例203 从控制台输入密码 9.4 Math类的使用 实例204 角度和弧度的转换 实例205 三角函数的使用 实例206 反三角函数的使用 实例207 双曲函数的使用 实例208 指数与对数运算 9.5 ...
  • 实例045 用数组设置JTable表格的列名与列宽 55 3.2 数组操作 57 实例046 数组的下标界限 57 实例047 按钮控件数组实现计数器界面 58 实例048 复选框控件数组 59 实例049 用数组反转字符串 60 3.3 数组排序与查询 61 ...
  • 实例045 用数组设置JTable表格的列名与列宽 55 3.2 数组操作 57 实例046 数组的下标界限 57 实例047 按钮控件数组实现计数器界面 58 实例048 复选框控件数组 59 实例049 用数组反转字符串 60 3.3 数组排序与查询 61 ...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 146
精华内容 58
关键字:

学生时间表格图片