精华内容
下载资源
问答
  • C# 使用Excel模板复制单元格

    千次阅读 2012-03-27 11:13:01
    string saveFileName = ""; SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.DefaultExt = ...templateRange是源区域,targetRange是目标区域,调用源区域的Copy方法将内容整个复制到目标区域。

    string saveFileName = "";
    SaveFileDialog saveDialog = new SaveFileDialog();
    saveDialog.DefaultExt = "xls";
    saveDialog.Filter = "Excel文件|*.xls";
    saveDialog.FileName = “test”;
    saveDialog.ShowDialog();
    saveFileName = saveDialog.FileName;
    if (saveFileName.IndexOf(":") < 0)
    {
          //被点了取消
          return;
    }


    Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();

    string filePath = "c:\test.xls";
    Workbooks workbooks = xlApp.Workbooks;
    Workbook workbook = workbooks.Add(filePath);
    Worksheet worksheet = (Worksheet)workbook.Worksheets[1];
    int startRow = 4;
    int totalColumns = 8;
    int totalRows = 10;
    Range templateRange = worksheet.get_Range(worksheet.Cells[startRow, 1], worksheet.Cells[startRow, totalColumns]);
    Range targetRange = worksheet.get_Range(worksheet.Cells[startRow, 1], worksheet.Cells[startRow + totalRows, totalColumns]);
    templateRange.Copy(targetRange);

    System.Windows.Forms.Application.DoEvents();
       //列宽自适应
     worksheet.Columns.EntireColumn.AutoFit();
      //列高自适应
     worksheet.Rows.EntireRow.AutoFit();  
    try
      {
       //设置禁止弹出保存和覆盖的询问提示框    
         xlApp.DisplayAlerts = false;
         xlApp.AlertBeforeOverwriting = false;
        //保存工作簿    
        workbook.Save();
        //保存excel文件    
        xlApp.Save(saveFileName);
         xlApp.SaveWorkspace(saveFileName);
         xlApp.Quit();
         xlApp = null;
      }catch (Exception ex)
        {
            MessageBox.Show("EXCEL文件已填充完毕,但在保存时发生错误");
       }
     
    templateRange是源区域,targetRange是目标区域,调用源区域的Copy方法将内容整个复制到目标区域。
    展开全文
  • java poi实现病历数据的word导出(包括word模板使用复制表格、复制行、插入图片的使用) 1.实现的效果 实现病人基本信息、多条病历数据、多项检查项图片的动态插入(网络图片) [外链图片转存失败(img-xiVmRGdl...

    java poi实现数据的word导出(包括word模板的使用、复制表格、复制行、插入图片的使用)

    1.实现的效果

    实现病人基本信息、多条病历数据、多项检查项图片的动态插入(网络图片)
    在这里插入图片描述

    2.模板

    把word中的占位符替换为实际的值,注意WPFRun表示有相同属性的一段文本,所以模板里变量内容需要从左到右的顺序写,${name},如果先写${},再添加内容,会拆分成几部分,不能正常使用,因此若出现替换失败的情况,可以尝试手动修改占位符,不要偷懒直接复制
    在这里插入图片描述

    3.pom.xml中相关依赖

    包括poi和模板

    <!-- poi -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.15-beta2</version>
    </dependency>
    <!-- 模板 -->
    <dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>ooxml-schemas</artifactId>
          <version>1.1</version>
    </dependency>
    
    

    4.导出的工具类

    /**
     * 功能描述:word工具类
     *
     * @author jynn
     * @created 2019年8月15日
     * @version 1.0.0
     */
    public class WordUtil {
    
          /**
           * 功能描述:word下载
           *
           * @param response
           * @param patientMap
           * @param list
           * @param itemList
           * @param file
           * @see [相关类/方法](可选)
           * @since [产品/模块版本](可选)
           */
          public static final void DownloadWord(HttpServletResponse 
    response, Map<String, Object> patientMap,
                      List<Map<String, Object>> list, List<List<String>> 
    itemList, String file) {
                CustomXWPFDocument document = null;
                ServletOutputStream servletOS = null;
                ByteArrayOutputStream ostream = null;
                // 添加表格
                try {
                      servletOS = response.getOutputStream();
                      ostream = new ByteArrayOutputStream();
                      // 生成word文档并读取模板
                      document = new 
    CustomXWPFDocument(POIXMLDocument.openPackage(file));
                      // 病人信息
                      XWPFTable patientTable = document.getTables().get(0);
                      eachTable(document, patientTable.getRows(), patientMap);
                      // 病历信息
                      // 根据病历数量复制表格
                      for (int i = 0; i < list.size(); i++) {
                            // 标题
                            XWPFParagraph paragraph = document.createParagraph();
                            XWPFRun paragraphRun = paragraph.createRun();
                            paragraphRun.setText(list.get(i).get("${title}").toString());
                            paragraph.setAlignment(ParagraphAlignment.CENTER);
                            // 创建新的 CTTbl , table
                            CTTbl ctTbl = CTTbl.Factory.newInstance(); 
                            // 复制原来的CTTbl
                            ctTbl.set(document.getTables().get(1).getCTTbl()); 
                            IBody iBody = document.getTables().get(1).getBody();
                            BeanUtils.copyProperties(document.getTables().get(1).getBody(), iBody);
                            XWPFTable newTable = new XWPFTable(ctTbl, iBody); 
                            // 新增一个table,使用复制好的Cttbl
                            List<String> iList = itemList.get(i);
                            Integer itemIndex = 0;
                            // 新建西医检查信息
                            for (String item : iList) {
                                  // 复制行,主要用于复制样式和重设图片文本
                                  // 直接新增行还需要手动改样式,比较繁琐
                                  XWPFTableRow titleRow = newTable.createRow();
                                  // 注意setText方式是在原来文本的后面添加,若不需要原先的文本在需要删除原先的run,新增一个run
                                  copyTableRow(titleRow, newTable.getRows().get(7), null);
                                  titleRow.getTableCells().get(0).setText(item);
                                  XWPFTableRow imageRow = newTable.createRow();
                                  // 带入序号重设文本
                                  copyTableRow(imageRow, newTable.getRows().get(8), itemIndex);
                                  itemIndex++;
                            }
                            // 删除作为模板的检查项标题和图片行
                            newTable.removeRow(7);
                            newTable.removeRow(7);
                            // 遍历表格,并替换模板
                            eachTable(document, newTable.getRows(), list.get(i));
                            document.createTable(); // 创建一个空的Table
                            // 设置table值
                            document.setTable(i + 2, newTable); // 将table设置到word中
                      }
                      List<XWPFTable> tables = document.getTables();
                      // 删除作为模板的第一个表格
                      for (int i = tables.get(1).getRows().size(); i >= 0; i--) {
                            tables.get(1).removeRow(i);
                      }
                      // 输出word内容文件流,提供下载
                      response.setContentType("application/x-msdownload");
                      String name = java.net.URLEncoder.encode("病历.docx", "UTF8");
                      name = new String((name).getBytes("UTF-8"), "ISO-8859-1");
                      response.addHeader("Content-Disposition", "attachment; 
    filename*=utf-8'zh_cn'" + name);
                      document.write(ostream);
                      servletOS.write(ostream.toByteArray());
                } catch (Exception e) {
                      System.out.print(e.getMessage());
                } finally {
                      try {
                            if (ostream != null) {
                                  ostream.close();
                            }
                            if (servletOS != null) {
                                  servletOS.close();
                            }
                      } catch (IOException e) {
    
                      }
                }
          }
    
          /**
           * 功能描述:复制单元格,从source到target
           *
           * @param target
           * @param source
           * @param index
           * @see [相关类/方法](可选)
           * @since [产品/模块版本](可选)
           */
          public static void copyTableCell(XWPFTableCell target, 
    XWPFTableCell source, Integer index) {
                // 列属性
                if (source.getCTTc() != null) {
                      target.getCTTc().setTcPr(source.getCTTc().getTcPr());
                }
                // 删除段落
                for (int pos = 0; pos < target.getParagraphs().size(); pos++) {
                      target.removeParagraph(pos);
                }
                // 添加段落
                for (XWPFParagraph sp : source.getParagraphs()) {
                      XWPFParagraph targetP = target.addParagraph();
                      copyParagraph(targetP, sp, index);
                }
          }
    
          /**
           * 功能描述:复制段落,从source到target
           *
           * @param target
           * @param source
           * @param index
           * @see [相关类/方法](可选)
           * @since [产品/模块版本](可选)
           */
          public static void copyParagraph(XWPFParagraph target, 
    XWPFParagraph source, Integer index) {
                // 设置段落样式
                target.getCTP().setPPr(source.getCTP().getPPr());
                // 移除所有的run
                for (int pos = target.getRuns().size() - 1; pos >= 0; pos--) {
                      target.removeRun(pos);
                }
                // copy 新的run
                for (XWPFRun s : source.getRuns()) {
                      XWPFRun targetrun = target.createRun();
                      copyRun(targetrun, s, index);
                }
          }
    
          /**
           * 功能描述:复制RUN,从source到target
           *
           * @param target
           * @param source
           * @param index
           * @see [相关类/方法](可选)
           * @since [产品/模块版本](可选)
           */
          public static void copyRun(XWPFRun target, XWPFRun source, Integer 
    index) {
                // 设置run属性
                target.getCTR().setRPr(source.getCTR().getRPr());
                // 设置文本
                String tail = "";
                if (index != null) {
                      tail = index.toString();
                }
                target.setText(source.text().replace("}", "") + tail + "}");
          }
    
          /**
           * 功能描述:复制行,从source到target
           *
           * @param target
           * @param source
           * @param index
           * @see [相关类/方法](可选)
           * @since [产品/模块版本](可选)
           */
          public static void copyTableRow(XWPFTableRow target, XWPFTableRow 
    source, Integer index) {
                // 复制样式
                if (source.getCtRow() != null) {
                      target.getCtRow().setTrPr(source.getCtRow().getTrPr());
                }
                // 复制单元格
                for (int i = 0; i < source.getTableCells().size(); i++) {
                      XWPFTableCell cell1 = target.getCell(i);
                      XWPFTableCell cell2 = source.getCell(i);
                      if (cell1 == null) {
                            cell1 = target.addNewTableCell();
                      }
                      copyTableCell(cell1, cell2, index);
                }
          }
    
          /**
           * 功能描述:遍历表格,替换信息
           *
           * @param document
           * @param rows
           * @param textMap
           * @see [相关类/方法](可选)
           * @since [产品/模块版本](可选)
           */
          public static void eachTable(CustomXWPFDocument document, 
    List<XWPFTableRow> rows, Map<String, Object> textMap) {
                for (XWPFTableRow row : rows) {
                      List<XWPFTableCell> cells = row.getTableCells();
                      for (XWPFTableCell cell : cells) {
                            // 判断单元格是否需要替换
                            if (checkText(cell.getText())) {
                                  List<XWPFParagraph> paragraphs = cell.getParagraphs();
                                  for (XWPFParagraph paragraph : paragraphs) {
                                        List<XWPFRun> runs = paragraph.getRuns();
                                        for (XWPFRun run : runs) {
                                              Object ob = changeValue(run.toString(), textMap);
                                              if (ob instanceof String) {
                                                    run.setText((String) ob, 0);
                                              } else if (ob instanceof Map)  {
                                                    run.setText("", 0);
                                                    <u>Map</u> pic = (<u>Map</u>) ob;
                                                    int width = 
    Integer.parseInt(pic.get("width").toString());
                                                    int height = 
    Integer.parseInt(pic.get("height").toString());
                                                    int picType = 
    getPictureType(pic.get("type").toString());
                                                    String urls = 
    pic.get("content").toString();
                                                    String[] urlList = 
    urls.split(";");
                                                    for (String url : 
    urlList) {
                                                          ByteArrayInputStream byteInputStream;
                                                          try {
                                                                //网络图片取文件数据
                                                                byteInputStream = new ByteArrayInputStream(getImageData(url));
                                                                document.addPictureData(byteInputStream, picType);
                                                                int id2 = 
    document.getAllPackagePictures().size() - 1;
                                                                document.createPicture(id2, width, height, paragraph);
                                                          } catch (Exception 
    e) {
                                                                e.printStackTrace();
                                                          }
                                                    }
                                              }
                                              break;
                                        }
                                  }
                            }
                      }
                }
          }
    
    
    
          /**
           * 功能描述:读取线上图片文件流
           *
           * @param strUrl
           * @return
           * @see [相关类/方法](可选)
           * @since [产品/模块版本](可选)
           */
          public static byte[] getImageData(String strUrl) {
                InputStream inStream = null;
                try {
                      // new一个URL对象
                      URL url = new URL(strUrl);
                      // 打开链接
                      HttpURLConnection conn = (HttpURLConnection) 
    url.openConnection();
                      // 设置请求方式为"GET"
                      conn.setRequestMethod("GET");
                      // 超时响应时间为5秒
                      conn.setConnectTimeout(10 * 1000);
                      // 通过输入流获取图片数据
                      inStream = conn.getInputStream();
                      byte[] data = readInputStream(inStream);
                      return data;
                } catch (Exception e) {
                      return null;
                } finally {
                      if (inStream != null) {
                            try {
                                  inStream.close();
                            } catch (Exception e2) {
                                  System.out.println("关闭流失败");
                            }
                      }
                }
          }
    
          /**
           * 功能描述:读取文件流
           *
           * @param inStream
           * @return
           * @throws Exception
           * @see [相关类/方法](可选)
           * @since [产品/模块版本](可选)
           */
          public static 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();
          }
    
          /**
           * 功能描述:为表格插入数据,行数不够添加新行
           *
           * @param table
           * @param tableList
           * @param daList
           * @param type
           * @see [相关类/方法](可选)
           * @since [产品/模块版本](可选)
           */
          public static void insertTable(XWPFTable table, List<String> 
    tableList, List<String[]> daList, Integer type) {
                if (2 == type) {
                      // 创建行和创建需要的列
                      for (int i = 1; i < daList.size(); i++) {
                            // 添加一个新行
                            XWPFTableRow row = table.insertNewTableRow(1);
                            for (int k = 0; k < daList.get(0).length; k++) {
                                   // 根据String数组第一条数据的长度动态创建列
                                  row.createCell();
                            }
                      }
                      // 创建行,根据需要插入的数据添加新行,不处理表头
                      for (int i = 0; i < daList.size(); i++) {
                            List<XWPFTableCell> cells = table.getRow(i + 
    1).getTableCells();
                            for (int j = 0; j < cells.size(); j++) {
                                  XWPFTableCell cell02 = cells.get(j);
                                  cell02.setText(daList.get(i)[j]);
                            }
                      }
                } else if (4 == type) {
                      // 插入表头下面第一行的数据
                      for (int i = 0; i < tableList.size(); i++) {
                            XWPFTableRow row = table.createRow();
                            List<XWPFTableCell> cells = row.getTableCells();
                            cells.get(0).setText(tableList.get(i));
                      }
                }
          }
    
          /**
           * 功能描述:判断文本中时候包含$
           *
           * @param text
           * @return
           * @see [相关类/方法](可选)
           * @since [产品/模块版本](可选)
           */
          public static boolean checkText(String text) {
                boolean check = false;
                if (text.indexOf("$") != -1) {
                      check = true;
                }
                return check;
          }
    
          /**
           * 功能描述:匹配传入信息集合与模板
           *
           * @param value
           * @param textMap
           * @return
           * @see [相关类/方法](可选)
           * @since [产品/模块版本](可选)
           */
    
          public static Object changeValue(String value, Map<String, Object> 
    textMap) {
                Set<Map.Entry<String, Object>> textSets = 
    textMap.entrySet();
                Object valu = "";
                for (Map.Entry<String, Object> textSet : textSets) {
                      // 匹配模板与替换值 格式${key}
                      String key = textSet.getKey();
                      if (value.indexOf(key) != -1) {
                            valu = textSet.getValue();
                      }
                }
                return valu;
          }
    
          /**
           * 功能描述:根据图片类型,取得对应的图片类型代码
           *
           * @param picType
           * @return
           * @see [相关类/方法](可选)
           * @since [产品/模块版本](可选)
           */
          private static 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;
          }
    }
    

    5.自定义的ducument

    主要需要重写document的创建图片方法

    /**
     * 功能描述:自定义XWPFDocument,并重写 createPicture()方法
     *
     * @author jynn
     * @created 2019年8月18日
     * @version 1.0.0
     */
    public class CustomXWPFDocument extends XWPFDocument {
    
          public CustomXWPFDocument() {
                super();
          }
    
          public CustomXWPFDocument(OPCPackage opcPackage) throws 
    IOException {
                super(opcPackage);
          }
    
          public CustomXWPFDocument(InputStream in) throws IOException {
                super(in);
          }
          
          /**
           * 功能描述:创建图片
           *
           * @param id
           * @param width
           * @param height
           * @param paragraph
           * @return
           * @see [相关类/方法](可选)
           * @since [产品/模块版本](可选)
           */
          public void createPicture(int id, int width, int height, 
    XWPFParagraph paragraph) {
                final int EMU = 9525;
                width *= EMU;
                height *= EMU;
                String blipId = 
    getAllPictures().get(id).<u>getPackageRelationship</u><u>()</u>.getId();
                CTInline inline = 
    paragraph.createRun().getCTR().addNewDrawing().addNewInline();
                System.out.println(blipId + ":" + inline);
                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);
                inline.setDistT(0);
                inline.setDistB(0);
                inline.setDistL(0);
                inline.setDistR(0);
                CTPositiveSize2D extent = inline.addNewExtent();
                extent.setCx(width);
                extent.setCy(height);
                CTNonVisualDrawingProps docPr = inline.addNewDocPr();
                docPr.setId(id);
                docPr.setName("图片" + id);
                docPr.setDescr("测试");
          }
    }
    

    6.源代码

    运行接口:http://localhost:9400/word/export
    https://github.com/JynnFun/word

    展开全文
  • Tornado使用模板

    万次阅读 2018-08-31 01:00:01
    使用模板,需要仿照静态文件路径设置一样,向web.Application类的构造函数传递一个名为template_path的参数来告诉Tornado从文件系统的一个特定位置提供模板文件,如: # -*- coding: utf-8 -*- # @Author : G_...

     

    使用模板

    1. 路径与渲染

    使用模板,需要仿照静态文件路径设置一样,向web.Application类的构造函数传递一个名为template_path的参数来告诉Tornado从文件系统的一个特定位置提供模板文件,如:

    # -*- coding: utf-8 -*-
    # @Author  : G_SANGSK
    
    
    app = tornado.web.Application(
        [(r'/', IndexHandler)],
        static_path=os.path.join(os.path.dirname(__file__), "statics"),
        template_path=os.path.join(os.path.dirname(__file__), "templates"),
    )
    

    在这里,我们设置了一个当前应用目录下名为templates的子目录作为template_path的参数。在handler中使用的模板将在此目录中寻找。

    现在我们将静态文件目录statics/html中的index.html复制一份到templates目录中,此时文件目录结构为:

    # -*- coding: utf-8 -*-
    # @Author  : G_SANGSK
    
    .
    ├── statics
    │   ├── css
    │   │   ├── index.css
    │   │   ├── main.css
    │   │   └── reset.css
    │   ├── html
    │   │   └── index.html
    │   ├── images
    │   │   ├── home01.jpg
    │   │   ├── home02.jpg
    │   │   ├── home03.jpg
    │   │   └── landlord01.jpg
    │   ├── js
    │   │   ├── index.js
    │   │   └── jquery.min.js
    │   └── plugins
    │       ├── bootstrap
    │       │   └─...
    │       └── font-awesome
    │           └─...
    ├── templates
    │   └── index.html
    └── test.py
    

    在handler中使用render()方法来渲染模板并返回给客户端

    # -*- coding: utf-8 -*-
    # @Author  : G_SANGSK
    
    class IndexHandler(RequestHandler):
        def get(self):
            self.render("index.html") # 渲染主页模板,并返回给客户端。
    
    
    
    current_path = os.path.dirname(__file__)
    app = tornado.web.Application(
        [
            (r'^/$', IndexHandler),
            (r'^/view/(.*)$', StaticFileHandler, {"path":os.path.join(current_path, "statics/html")}),
        ],
        static_path=os.path.join(current_path, "statics"),
        template_path=os.path.join(os.path.dirname(__file__), "templates"),
    )
    

    2. 模板语法

    1- 变量与表达式

    在tornado的模板中使用{{}}作为变量或表达式的占位符,使用render渲染后占位符{{}}会被替换为相应的结果值。

    我们将index.html中的一条房源信息记录

    <li class="house-item">
        <a href=""><img src="/static/images/home01.jpg"></a>
        <div class="house-desc">
            <div class="landlord-pic"><img src="/static/images/landlord01.jpg"></div>
            <div class="house-price">¥<span>398</span>/晚</div>
            <div class="house-intro">
                <span class="house-title">宽窄巷子+160平大空间+文化保护区双地铁</span>
                <em>整套出租 - 5分/6点评 - 北京市丰台区六里桥地铁</em>
            </div>
        </div>
    </li>
    

    改为模板:

    # -*- coding: utf-8 -*-
    # @Author  : G_SANGSK
    
    <li class="house-item">
        <a href=""><img src="/static/images/home01.jpg"></a>
        <div class="house-desc">
            <div class="landlord-pic"><img src="/static/images/landlord01.jpg"></div>
            <div class="house-price">¥<span>{{price}}</span>/晚</div>
            <div class="house-intro">
                <span class="house-title">{{title}}</span>
                <em>整套出租 - {{score}}分/{{comments}}点评 - {{position}}</em>
            </div>
        </div>
    </li>
    

    渲染方式如下:

    class IndexHandler(RequestHandler):
        def get(self):
            house_info = {
                "price": 398,
                "title": "宽窄巷子+160平大空间+文化保护区双地铁",
                "score": 5,
                "comments": 6,
                "position": "北京市丰台区六里桥地铁"
            }
            self.render("index.html", **house_info)
    

    {{}}不仅可以包含变量,还可以是表达式,如:

    <li class="house-item">
        <a href=""><img src="/static/images/home01.jpg"></a>
        <div class="house-desc">
            <div class="landlord-pic"><img src="/static/images/landlord01.jpg"></div>
            <div class="house-price">¥<span>{{p1 + p2}}</span>/晚</div>
            <div class="house-intro">
                <span class="house-title">{{"+".join(titles)}}</span>
                <em>整套出租 - {{score}}分/{{comments}}点评 - {{position}}</em>
            </div>
        </div>
    </li>
    
    class IndexHandler(RequestHandler):
        def get(self):
            house_info = {
                "p1": 198,
                "p2": 200,
                "titles": ["宽窄巷子", "160平大空间", "文化保护区双地铁"],
                "score": 5,
                "comments": 6,
                "position": "北京市丰台区六里桥地铁"
            }
            self.render("index.html", **house_info)
    

    2- 控制语句

    可以在Tornado模板中使用Python条件和循环语句。控制语句以{\%和\%}包围,并以类似下面的形式被使用:

    {% if page is None %}
    

    {% if len(entries) == 3 %}
    

    控制语句的大部分就像对应的Python语句一样工作,支持if、for、while,注意end:

    {% if ... %} ... {% elif ... %} ... {% else ... %} ... {% end %}
    {% for ... in ... %} ... {% end %}
    {% while ... %} ... {% end %}
    

    再次修改index.html:

    # -*- coding: utf-8 -*-
    # @Author  : G_SANGSK
    
    <ul class="house-list">
        {% if len(houses) > 0 %}
            {% for house in houses %}
            <li class="house-item">
                <a href=""><img src="/static/images/home01.jpg"></a>
                <div class="house-desc">
                    <div class="landlord-pic"><img src="/static/images/landlord01.jpg"></div>
                    <div class="house-price">¥<span>{{house["price"]}}</span>/晚</div>
                    <div class="house-intro">
                        <span class="house-title">{{house["title"]}}</span>
                        <em>整套出租 - {{house["score"]}}分/{{house["comments"]}}点评 - {{house["position"]}}</em>
                    </div>
                </div>
            </li>
            {% end %}
        {% else %}
            对不起,暂时没有房源。
        {% end %}
    </ul>
    

    python中渲染语句为:

    # -*- coding: utf-8 -*-
    # @Author  : G_SANGSK
    
    class IndexHandler(RequestHandler):
        def get(self):
            houses = [
            {
                "price": 398,
                "title": "宽窄巷子+160平大空间+文化保护区双地铁",
                "score": 5,
                "comments": 6,
                "position": "北京市丰台区六里桥地铁"
            },
            {
                "price": 398,
                "title": "宽窄巷子+160平大空间+文化保护区双地铁",
                "score": 5,
                "comments": 6,
                "position": "北京市丰台区六里桥地铁"
            },
            {
                "price": 398,
                "title": "宽窄巷子+160平大空间+文化保护区双地铁",
                "score": 5,
                "comments": 6,
                "position": "北京市丰台区六里桥地铁"
            },
            {
                "price": 398,
                "title": "宽窄巷子+160平大空间+文化保护区双地铁",
                "score": 5,
                "comments": 6,
                "position": "北京市丰台区六里桥地铁"
            },
            {
                "price": 398,
                "title": "宽窄巷子+160平大空间+文化保护区双地铁",
                "score": 5,
                "comments": 6,
                "position": "北京市丰台区六里桥地铁"
            }]
            self.render("index.html", houses=houses)
    

    3- 函数

    static_url()

    Tornado模板模块提供了一个叫作static_url的函数来生成静态文件目录下文件的URL。如下面的示例代码:

    <link rel="stylesheet" href="{{ static_url("style.css") }}">
    

    这个对static_url的调用生成了URL的值,并渲染输出类似下面的代码:

    <link rel="stylesheet" href="/static/style.css?v=ab12">
    

    优点:

    • static_url函数创建了一个基于文件内容的hash值,并将其添加到URL末尾(查询字符串的参数v)。这个hash值确保浏览器总是加载一个文件的最新版而不是之前的缓存版本。无论是在你应用的开发阶段,还是在部署到生产环境使用时,都非常有用,因为你的用户不必再为了看到你的静态内容而清除浏览器缓存了。
    • 另一个好处是你可以改变你应用URL的结构,而不需要改变模板中的代码。例如,可以通过设置static_url_prefix来更改Tornado的默认静态路径前缀/static。如果使用static_url而不是硬编码的话,代码不需要改变。

    转义

    我们新建一个表单页面new.html

    # -*- coding: utf-8 -*-
    # @Author  : G_SANGSK
    
    <!DOCTYPE html>
    <html>
        <head>
            <title>新建房源</title>
        </head>
        <body>
            <form method="post">
                <textarea name="text"></textarea>
                <input type="submit" value="提交">
            </form>
            {{text}}
        </body>
    </html>
    

    对应的handler为:

    class NewHandler(RequestHandler):
    
        def get(self):
            self.render("new.html", text="")
    
        def post(self):
            text = self.get_argument("text", "") 
            print text
            self.render("new.html", text=text)
    

    当我们在表单中填入如下内容时:

    <script>alert("hello!");</script>

     

     

    我们查看页面源代码,发现<、>、"等被转换为对应的html字符。

    &lt;script&gt;alert(&quot;hello!&quot;);&lt;/script&gt;
    

    这是因为tornado中默认开启了模板自动转义功能,防止网站受到恶意攻击。

    我们可以通过raw语句来输出不被转义的原始格式,如:

    {% raw text %}
    

    注意:在Firefox浏览器中会直接弹出alert窗口,而在Chrome浏览器中,需要set_header("X-XSS-Protection", 0)

    若要关闭自动转义,一种方法是在Application构造函数中传递autoescape=None,另一种方法是在每页模板中修改自动转义行为,添加如下语句:

    {% autoescape None %}
    

    escape()

    关闭自动转义后,可以使用escape()函数来对特定变量进行转义,如:

    {{ escape(text) }}
    

    自定义函数

    在模板中还可以使用一个自己编写的函数,只需要将函数名作为模板的参数传递即可,就像其他变量一样。

    我们修改后端如下:

    # -*- coding: utf-8 -*-
    # @Author  : G_SANGSK
    
    def house_title_join(titles):
        return "+".join(titles)
    
    class IndexHandler(RequestHandler):
        def get(self):
            house_list = [
            {
                "price": 398,
                "titles": ["宽窄巷子", "160平大空间", "文化保护区双地铁"],
                "score": 5,
                "comments": 6,
                "position": "北京市丰台区六里桥地铁"
            },
            {
                "price": 398,
                "titles": ["宽窄巷子", "160平大空间", "文化保护区双地铁"],
                "score": 5,
                "comments": 6,
                "position": "北京市丰台区六里桥地铁"
            }]
            self.render("index.html", houses=house_list, title_join = house_title_join)
    

    前段模板我们修改为:

    # -*- coding: utf-8 -*-
    # @Author  : G_SANGSK
    
    <ul class="house-list">
        {% if len(houses) > 0 %}
            {% for house in houses %}
            <li class="house-item">
                <a href=""><img src="/static/images/home01.jpg"></a>
                <div class="house-desc">
                    <div class="landlord-pic"><img src="/static/images/landlord01.jpg"></div>
                    <div class="house-price">¥<span>{{house["price"]}}</span>/晚</div>
                    <div class="house-intro">
                        <span class="house-title">{{title_join(house["titles"])}}</span>
                        <em>整套出租 - {{house["score"]}}分/{{house["comments"]}}点评 - {{house["position"]}}</em>
                    </div>
                </div>
            </li>
            {% end %}
        {% else %}
            对不起,暂时没有房源。
        {% end %}
    </ul>
    

    4- 块

    我们可以使用块来复用模板,块语法如下:

    {% block block_name %} {% end %}
    

    现在,我们对模板index.html进行抽象,抽离出父模板base.html如下:

    # -*- coding: utf-8 -*-
    # @Author  : G_SANGSK
    <!DOCTYPE html>
    <html>
    <head> 
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
        {% block page_title %}{% end %}
        <link href="{{static_url('plugins/bootstrap/css/bootstrap.min.css')}}" rel="stylesheet">
        <link href="{{static_url('plugins/font-awesome/css/font-awesome.min.css')}}" rel="stylesheet">
        <link href="{{static_url('css/reset.css')}}" rel="stylesheet">
        <link href="{{static_url('css/main.css')}}" rel="stylesheet">
        {% block css_files %}{% end %}
    </head>
    <body>
        <div class="container">
            <div class="top-bar">
                {% block header %}{% end %}
            </div>
            {% block body %}{% end %}
            <div class="footer">
                {% block footer %}{% end %}
            </div>
        </div>
    
        <script src="{{static_url('js/jquery.min.js')}}"></script>
        <script src="{{static_url('plugins/bootstrap/js/bootstrap.min.js')}}"></script>
        {% block js_files %}{% end %}
    </body>
    </html>
    

    而子模板index.html使用extends来使用父模板base.html,如下:

    # -*- coding: utf-8 -*-
    # @Author  : G_SANGSK
    
    {% extends "base.html" %}
    
    {% block page_title %}
        <title>爱家-房源</title>
    {% end %}
    
    {% block css_files %}
        <link href="{{static_url('css/index.css')}}" rel="stylesheet">
    {% end %} 
    
    {% block js_files %}
        <script src="{{static_url('js/index.js')}}"></script>
    {% end %}
    
    {% block header %}
        <div class="nav-bar">
            <h3 class="page-title">房 源</h3>
        </div>
    {% end %}
    
    {% block body %}
        <ul class="house-list">
        {% if len(houses) > 0 %}
            {% for house in houses %}
            <li class="house-item">
                <a href=""><img src="/static/images/home01.jpg"></a>
                <div class="house-desc">
                    <div class="landlord-pic"><img src="/static/images/landlord01.jpg"></div>
                    <div class="house-price">¥<span>{{house["price"]}}</span>/晚</div>
                    <div class="house-intro">
                        <span class="house-title">{{title_join(house["titles"])}}</span>
                        <em>整套出租 - {{house["score"]}}分/{{house["comments"]}}点评 - {{house["position"]}}</em>
                    </div>
                </div>
            </li>
            {% end %}
        {% else %}
            对不起,暂时没有房源。
        {% end %}
        </ul>
    {% end %}
    
    {% block footer %}
        <p><span><i class="fa fa-copyright"></i></span>爱家租房&nbsp;&nbsp;享受家的温馨</p>
    {% end %}

     

    展开全文
  • ![]... Java使用POI模板导出Excel,模板中现在的明细行是5行,现在数据超过5行,怎么复制明细行的格式进行增行
  • 如题,我已经做出了,复制指定table,然后粘贴,但是我想复制一页的内容,模板中除了table外,还有标题,我想一起复制,然后粘贴到下一页?
  • java POI复制模板excel

    千次阅读 2018-04-29 17:39:39
    直接使用java poi生成excel报表是件麻烦的事情,因为java poi直接生成需要对excel报表的格式进行很多设计,这样会增加不少代码工作量。实际开发中一般采用excel模板,通过poi将数据填入模板中生成新的报表。  在...
        直接使用java poi生成excel报表是件麻烦的事情,因为java poi直接生成需要对excel报表的格式进行很多设计,这样会增加不少代码工作量。实际开发中一般采用excel模板,通过poi将数据填入模板中生成新的报表。
        在java代码中,将模板文件以流的形式传入,通过HSSFWorkbook类对流进行操作,根据实际情况在下面代码注释的位置进行数据填入的操作,最后以输出流的形式导出新的报表。代码如下:
     public void copyExcel(String fromexcel, String newexcel) {  
            HSSFWorkbook wb = null;
            FileInputStream fis =null;
            FileOutputStream fos = null;
            try {  
            	fis = new FileInputStream(fromexcel);
            	fos = new FileOutputStream(newexcel);
                wb = new HSSFWorkbook(fis);  
                /*HSSFSheet fromsheet = wb.getSheetAt(0);
                Row row = fromsheet.getRow(1);
                Cell cell = row.getCell(2);
                cell.setCellValue("");*/
                wb.write(fos);
                fis.close();
                fos.close();
                
            } catch (Exception e) {  
                e.printStackTrace();  
            }finally{
    			try {
    				if(fis != null)
    					fis.close();
    				if(fos != null)
    					fos.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
        }


    展开全文
  • Eclipse 模板使用

    千次阅读 2018-10-02 15:43:33
    java editor template Eclipse中的快速Java代码模板使用 &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相信大家都用过Eclipse的缩写代码提示功能,如...
  • POI复制Excel模板并填充数据

    千次阅读 2018-02-26 11:03:00
    一、复制模板private static File createNewFile() { // 读取模板,并赋值到新文件************************************************************ // 文件模板路径 String path = (getSispPath()); File ...
  • Thymeleaf模板使用

    万次阅读 2015-03-28 14:08:46
    使用模板的要点:  页面主体结构固定,具体参数可变,尽可能让参数动态化,才能提高模板的复用性 =================================================================== Thymeleaf's core is a DOM processing ...
  • IEEE模板的latex使用

    万次阅读 多人点赞 2018-07-02 22:06:24
    IEEE模板下载 下载IEEE的conference和transaction的latex模板文件: conference:https://www.ieee.org/conferences/publishing/templates.html transaction模板:...
  • 具体解决方式就是templates下的东西直接覆盖掉原来templates里面的东西,statics里面的东西对应添加到statics里面就行。如果您下载的是整个网站的模板就直接...V9 模板使用 模板安装 模板怎么用?" title="phpcms V
  • Django公共模板使用

    千次阅读 2020-10-09 22:12:06
    引用:是整个html文件代码复制。 继承:只是继承其中一段代码的样式。 引用 这个是 base.html中引用 footer.html文件中的代码 <div class="panel-footer"> {% include 'footer.html' %} </div> 这...
  • 文件代码模板使用

    千次阅读 2015-09-30 18:54:34
    文件代码模板使用 发布于 2015-09-23 23:00:17 | 5 次阅读 | 评论: 0 | 来源: 网络整理 本篇内容为大家提供的是IntelliJ IDEA 使用教程中的文件代码模板使用,IntelliJ IDEA是java语言开发的集成...
  • zen cart复制盗用网站模板的方法

    千次阅读 2010-02-03 15:32:00
    首先说明的是,这里只是说明复制网站模板的理论,用于学习用途,复制使用未经授权的模板是非法的。第一次写这类说明,没有经验,欢迎大家指正、补充。这里以zen cart或者osc的模板为例,其他的模板也是同样的方法...
  • Java模板引擎FreeMarker介绍和使用

    千次阅读 2016-02-18 09:41:42
    FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 虽然FreeMarker具有一些编程的能力,但通常由Java程序...
  • 下载vue模板框架并使用

    千次阅读 2019-03-21 19:23:18
    第一步:先在谷歌上找到合适的vue模板复制它的git地址 下载模板 cd 到你想存放模板的路径 在cmd中键入命令 git clone github 地址 第二步:下载成功后 cd到package.json所在的路径 命令:...
  • zencart复制其他人模板的方法整理

    千次阅读 2010-06-14 19:47:00
    这里以zencart ...复制/includes /templates/template_default下的所有目录和文件到新的目录中 2. 用文本编辑器修改/includes/templates/mytemplate/template_info.php,修改其中的名称、版本、作者等
  • ACM MM会议-latex模板使用

    千次阅读 2020-05-17 13:35:13
    ACM MM会议-latex模板使用模板使用公式的编辑行内公式行间公式编号公式单行多行图片插入 latex模板踩坑记录 模板使用 投稿是ACM 下的 multi mudie 会议 , 使用sample-sigconf模板。新建一个文件夹将acmart-...
  • 如果是一条记录那么就这条记录的数据填充到word模板的表格中;如果查询的是多个记录,那么需要复制多这个这样表格来填充数据。这个需求不是对一个表格行的添加,而是要求表格本身的复制。    实现web...
  • 安装动态图形模板时,将其复制到 Premiere Pro 的本地模板文件夹,即可在任何 Premiere Pro 项目中进行使用。也可通过“基本图形”面板使用。在本篇文章中,我们介绍的是如何在 Premiere Pro 中使用动态图...
  • HTML制作之模板使用

    千次阅读 2012-05-17 07:22:32
    页面的头部和尾部都是一样的,我之前没有使用模板,都是每个页面都头部和尾部复制进去,可是一旦头部和尾部有改动,哪怕是一点点的改动,所以的页面的头部和尾部都要去手动的去改,非常苦恼,相当郁闷;用模板就...
  • 前文:本文是《云客drupal源码分析》系列的番外篇,由于drupal采用了twig模板引擎,因此该篇将详细介绍twig,但不会涉及drupal任何内容,是原生twig的使用详解,分上下两集,上集供设计师阅读,讲解在模板中的使用,...
  • 模板使用成员函数模板(member function template)处理隐式(implicit)转换 本文地址:http://blog.csdn.net/caroline_wendy/article/details/24233693 指针支持隐式转换(implicit conversion), 在动态绑定中, ...
  • ArcGIS教程:地图模板使用

    千次阅读 2014-07-02 14:22:08
    地图模板使得在一系列地图上重新使用或标准化布局变得很容易。使用模板可以节省时间,因为您不必手动重新生成地图的公共部分。像地图和图层一样,模板可以在组织内共享以提高工作效率并将组织生成的地图标准化。  ...
  • 模板下载地址: https://journals.ieeeauthorcenter.ieee.org/create-your-ieee-article/authoring-tools-and-templates/ieee-article-templates/ 以Transactions系列期刊为例, 下载文章LaTeX模板WIN or MAC ...
  • 爱思唯尔(Elsevier)期刊模板使用

    万次阅读 多人点赞 2019-02-25 18:47:59
    首先请正确安装latex软件! 介绍网址: ... 模板elsarticle.cls下载网址: http://www.ctan.org/tex-archive/macros/latex/contrib/elsarticle 直接下载:Down­load 网页打不...
  • 爱思唯尔(Elsevier)期刊模板使用 转载链接 https://blog.csdn.net/qq_17783559/article/details/87920065 ...
  • 本文简单介绍IntelliJ IDEA中文件代码模板使用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 245,457
精华内容 98,182
关键字:

怎么把模板复制使用