一:word处理图片功能,插入一张图片,并且设置大小,然后添加一段文字,测试图片和文字之间的换行效果:

public class ImgToWordTest {public static void main(String[] args) throws Exception {writeToWord();}/*** Word中写入图片示例* @throws Exception*/public static void writeToWord() throws Exception {FileOutputStream fos = new FileOutputStream("D:\\downWord\\temp.docx");String imgPath = "D:\\downWord\\test\\tianlong.png";   // 图片路径//创建文档对象XWPFDocument document = new XWPFDocument();//创建段落对象XWPFParagraph paragraph = document.createParagraph();//创建文本对象(今天的主角:XWPFRun----一段文本对象(就是一段文字))XWPFRun run = paragraph.createRun();//这里用的段落里的XWPFRun//第一种,用base64字符串解码后的base64字节数组File file = new File(imgPath);String png = getImageStr(file, "png");String codedata = png.substring(png.indexOf(",") + 1);byte[] bytes = new BASE64Decoder().decodeBuffer(codedata);String picId = document.addPictureData(bytes, CustomXWPFDocument.PICTURE_TYPE_PNG);//第二种用流的方式
//      FileInputStream fileInputStream = new FileInputStream(imgPath);
//      String picId = document.addPictureData(fileInputStream, CustomXWPFDocument.PICTURE_TYPE_PNG);WordocxUtil.addPictureToRun(run,picId,CustomXWPFDocument.PICTURE_TYPE_PNG,600,600);//当然也可以用表格里面的XWPFRun
//        InputStream inStream = WorderToNewWordUtils.class.getClassLoader().getResourceAsStream("templates/工具杀毒检测记录表.docx");
//        XWPFDocument doc = new XWPFDocument(inStream);
//        List<XWPFTable> xwpfTables = doc.getTables();
//        XWPFTable xwpfTable = xwpfTables.get(4);//这里假设拿下标为四的表
//        List<XWPFTableRow> rows = xwpfTable.getRows();
//        XWPFTableRow xwpfTableRow = rows.get(4);//这里假设拿下标为四的行
//        List<XWPFTableCell> tableCells = xwpfTableRow.getTableCells();
//        XWPFTableCell xwpfTableCell = tableCells.get(1);//这里假设拿下标为一的列
//        List<XWPFParagraph> paragraphs = xwpfTableCell.getParagraphs();
//        XWPFParagraph xwpfParagraph = paragraphs.get(0);//这里假设拿下标为0的段落
//        XWPFRun run2 = xwpfParagraph.createRun();//这个段落里创建一段文字
//        String picId2 = document.addPictureData(bytes, CustomXWPFDocument.PICTURE_TYPE_PNG);
//        WordocxUtil.addPictureToRun(run2,picId2,CustomXWPFDocument.PICTURE_TYPE_PNG,600,600);//run.addBreak(BreakType.COLUMN)----这里无论是PAGE,还是这个COLUMN,都是换页的效果;run.addCarriageReturn();//----加一个换行符//默认:宋体(wps)/等线(office2016) 5号 两端对齐 单倍间距run.setText("舜发于畎亩之中, 傅说举于版筑之间, 胶鬲举于鱼盐之中, 管夷吾举于士,孙叔敖举于海,百里奚举于市。故天将降大任于是人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。\n");run.addCarriageReturn();//----加一个换行符run.setText("人恒过,然后能改,困于心,衡于虑,而后作;征于色,发于声,而后喻。入则无法家拂士,出则无敌国外患者,国恒亡,然后知生于忧患而死于安乐也。");run.setBold(false);//加粗run.setColor("BED4F1");//设置颜色--十六进制run.setDoubleStrikethrough(false);//双删除线run.setEmbossed(false);//浮雕字体----效果和印记(悬浮阴影)类似//run.setFontFamily("宋体");run.setFontSize(14);//字体大小run.setImprinted(false);//印迹(悬浮阴影)---效果和浮雕类似run.setItalic(false);//斜体(字体倾斜)run.setShadow(true);//阴影---稍微有点效果(阴影不明显)run.setStrikeThrough(false);//单删除线(新的替换Strike)//run.setSubscript(VerticalAlign.SUBSCRIPT);//下标(吧当前这个run变成下标)---枚举//run.setUnderline(UnderlinePatterns.DASH_LONG);//各种类型的下划线(枚举)//ImageUtils.writeImage(run, imgPath)//这是一开始的时候,直接写了一张图片;document.write(fos);System.out.println("=========Word文件生成成功==========");//fileInputStream.close();fos.close();}//图片转化成base64字符串public static String getImageStr(File file, String fileType) throws IOException {String fileContentBase64 = null;String base64Str = "data:" + fileType + ";base64,";String content = null;//将图片文件转化为字节数组字符串,并对其进行Base64编码处理InputStream in = null;byte[] data = null;//读取图片字节数组try {in = new FileInputStream(file);data = new byte[in.available()];in.read(data);in.close();//对字节数组Base64编码if (data == null || data.length == 0) {return null;}//content = Base64.encodeBytes(data);content = new BASE64Encoder().encode(data);if (content == null || "".equals(content)) {return null;}fileContentBase64 = base64Str + content;} catch (IOException e) {e.printStackTrace();} finally {if (in != null) {in.close();}}return fileContentBase64;}
}

上文中用到的工具类:

/*** 报告导出*/
@Component
public class WordocxUtil {public static void addPictureToRun(XWPFRun run,String blipId,int id,int width, int height){final int EMU = 9525;width *= EMU;height *= EMU;CTInline inline =run.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>";//CTGraphicalObjectData graphicData = inline.addNewGraphic().addNewGraphicData();XmlToken xmlToken = null;try {xmlToken = XmlToken.Factory.parse(picXml);} catch(XmlException xe) {xe.printStackTrace();}inline.set(xmlToken);//graphicData.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("Picture " + id);docPr.setDescr("Generated");}/*创建FileItem*/public FileItem createFileItem(File file, String fieldName) {FileItemFactory factory = new DiskFileItemFactory(16, null);FileItem item = factory.createItem(fieldName, "text/plain", true, file.getName());int bytesRead = 0;byte[] buffer = new byte[8192];try {FileInputStream fis = new FileInputStream(file);OutputStream os = item.getOutputStream();while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {os.write(buffer, 0, bytesRead);}os.close();fis.close();} catch (IOException e) {e.printStackTrace();}return item;}public static void closeStream(InputStream inStream) {try {inStream.close();} catch (IOException e) {e.printStackTrace();}}public static void writer(XWPFDocument doc, String outSrc, Map<String,Object> map) {/*** 替换段落中指定的文本*/for(XWPFParagraph p : doc.getParagraphs()){List<XWPFRun> runs = p.getRuns();if(runs != null){for(XWPFRun r : runs){//需要替换的文本String text = r.getText(0);//替换指定的文本for(String key : map.keySet()){if(text != null && text.equals(key)){//替换的时候要注意,setText是有两个参数的//第一个是替换的文本,第二个是从哪里开始替换//0是替换全部,如果不设置那么默认就是从原文字//结尾开始追加r.setText((String)map.get(key),0);}}}}}/*** 替换表格中指定的文字*/for(XWPFTable tab : doc.getTables()){for(XWPFTableRow row : tab.getRows()){for(XWPFTableCell cell : row.getTableCells()){//注意,getParagraphs一定不能漏掉//因为一个表格里面可能会有多个需要替换的文字//如果没有这个步骤那么文字会替换不了for(XWPFParagraph p : cell.getParagraphs()){for(XWPFRun r : p.getRuns()){String text = r.getText(0);for(String key : map.keySet()){if(text!=null){if(text.equals(key)){r.setText((String)map.get(text),0);}}}}}}}}}}

二:word表格字段替换和插入功能示例:

//用户资料使用登记表----controller层//@Scheduled(fixedDelay = 600 * 1000)@GetMapping("/tEvaluationQueues/upRegister")public void getUpRegister(){log.debug("REST request to get upRegister");tEvaluationQueueService.getUpRegister();}//service层void getUpRegister();//serviceImpl层//用户资料使用登记表@Overridepublic void getUpRegister() {TEvaluationQueueExample example = new TEvaluationQueueExample();TEvaluationQueueExample.Criteria criteria = example.createCriteria();criteria.andStatusEqualTo(0);//未开始   后期还得一个各自自己的文件标记 6-1criteria.andEvaluationTypeIdEqualTo("6-1");List<TEvaluationQueue> que = tEvaluationQueueRepository.selectByExample(example);if (que!=null&&que.size()>0){for (TEvaluationQueue tEvaluationQueue : que) {//进入循环,更改状态为1----执行中tEvaluationQueue.setStatus(1);//只改动了status,其他的还是tEvaluationQueue的原值tEvaluationQueueRepository.updateByPrimaryKeySelective(tEvaluationQueue);//去对应表里查要替换的模板数据//系统名称String evaluationtInformationId = tEvaluationQueue.getEvaluationtInformationId();String evaluationtInformationname = getEvaluationtInformationname(evaluationtInformationId);//文档名称String evaluationId = tEvaluationQueue.getEvaluationId();List<String[]> tableList = getEvaluationtMaterialName(evaluationId);//最后一行,是走替换String num = String.valueOf(tableList.size()+1);//往模板里放数据String outputUrl = makeOutputUrl();Map<String, String> testMap = new HashMap<String, String>();testMap.put("evaluationtInformationname", evaluationtInformationname);testMap.put("num", num);InputStream inStream = WorderToNewWordUtils.class.getClassLoader().getResourceAsStream("templates/用户资料使用登记表.docx");WorderToNewWordUtils.changWord(inStream,outputUrl,testMap,tableList);System.out.println("success");//走完这个循环,更改状态为2----结束tEvaluationQueue.setStatus(2);//只改动了status,只更新statustEvaluationQueueRepository.updateByPrimaryKeySelective(tEvaluationQueue);//还得往文件库里插入一条记录//调用插入文件的方法File file = new File(outputUrl);saveTfile(file,"6-1",evaluationId,"用户资料使用登记表.docx");}}}//serviceImpl层封装的方法//插入文件的方法----serviceImpl这个业务类方法中封装的拿数据的方法(getEntrustingAddress(evaluationId),getProjectName(evaluationId)),就不在罗列了,没什么实际作用//这个最后插入一条文件记录的方法,或许有点抛砖引玉的作用,暂且罗列一下public TFile saveTfile(File file,String evaluationTypeId,String evaluationId,String fileName){//文件信息保存TFile tFile = new TFile();tFile.setFileId(CommonUtils.getUUID());tFile.setEvaluationTypeId(evaluationTypeId);tFile.setDependId(evaluationId);tFile.setAttachmentPath(fileUploadPath);//文件上传名称String name = file.getName();//tFile.setAttachmentName(name);//原文件名----就是模板的名字tFile.setFileName(fileName);//文件后缀String prefix = file.getName().substring(file.getName().lastIndexOf("."));tFile.setFileType(prefix);tFile.setAttachmentSize(new Long(file.length()).floatValue());tFile.setState(StatusEnum.NORMAL.value());tFile.setCreateTime(ZonedDateTime.now());tFile.setCreateUser(SecurityUtils.getCurrentUserName());tFile.setUpdateTime(ZonedDateTime.now());tFile.setUpdateUser(SecurityUtils.getCurrentUserName());TFile insert = tFileService.insert(tFile);return insert;}//还有一个实现类方法中封装的一个有点扯淡的臭方法//文档名称List<String[]> getEvaluationtMaterialName(String evaluationId){//state=1  这里没有删除功能,可以不用考虑这个//这个考虑到属性的原因,还需要用t_evaluationt_material表里查evaluationt_material_name,直接连表查,返回mapList<Map<String,String>> savedList = tEvaluationtDocumentsRepository.selectSaved(evaluationId);List<String[]> stringCells = new ArrayList<>();for (int i = 0; i < savedList.size(); i++) {Map<String, String> map = savedList.get(i);ArrayList<String> list = new ArrayList<>();//待会转成数组list.add(0,String.valueOf(i+1));if (map.size()<2){map.put("remark"," ");for (Map.Entry<String,String> entry : map.entrySet()){String key = entry.getKey();String value = entry.getValue();if ("evaluationtMaterialName".equals(key)){list.add(1,value);}if ("remark".equals(key)){list.add(2,value);}}}else {for (Map.Entry<String,String> entry : map.entrySet()){String key = entry.getKey();String value = entry.getValue();if ("remark".equals(key)){list.add(1,value);}if ("evaluationtMaterialName".equals(key)){list.add(2,value);String s = list.get(1);list.remove(s);list.add(s);}}}String[] stringcell = new String[]{list.get(0),list.get(1),list.get(2)};stringCells.add(stringcell);}return stringCells;}

此处用的工具类:

/*** 通过word模板生成新的word工具类*/
public class WorderToNewWordUtils {/*** 根据模板生成新word文档* 判断表格是需要替换还是需要插入,判断逻辑有$为替换,表格无$为插入// * @param inputUrl 模板存放地址* @param outputUrl 新文档存放地址* @param textMap 需要替换的信息集合//* @param tableList 需要插入的表格信息集合* @return 成功返回true,失败返回false*/public static boolean changWord(InputStream inStream,String outputUrl,Map<String, String> textMap,List<String[]> tableList) {//模板转换默认成功boolean changeFlag = true;try {//获取docx解析对象
//            InputStream inStream = null;//inStream = WorderToNewWordUtils.class.getClassLoader().getResourceAsStream("templates/网络安全等级保护测评报告评审表.docx");//POIXMLDocument.openPackage(inputUrl)XWPFDocument document = new XWPFDocument(inStream);//解析替换文本段落对象WorderToNewWordUtils.changeText(document, textMap);//解析替换表格对象WorderToNewWordUtils.changeTable(document, textMap,tableList);//生成新的wordFile file = new File(outputUrl);FileOutputStream stream = new FileOutputStream(file);document.write(stream);inStream.close();stream.close();} catch (IOException e) {e.printStackTrace();changeFlag = false;}return changeFlag;}/*** 替换段落文本* @param document docx解析对象* @param textMap 需要替换的信息集合*/public static void changeText(XWPFDocument document, Map<String, String> textMap){//获取段落集合List<XWPFParagraph> paragraphs = document.getParagraphs();for (XWPFParagraph paragraph : paragraphs) {//判断此段落时候需要进行替换String text = paragraph.getText();if(checkText(text)){List<XWPFRun> runs = paragraph.getRuns();for (XWPFRun run : runs) {//替换模板原来位置String value = changeValue(run.toString(), textMap);//run.setText(changeValue(run.toString(), textMap),0);//分段显示的情况String[] values = value.split("\n");if(values.length > 1) {run.setText(values[0],0);for (int i = 1; i < values.length; i++) {//存在分段则新建一个runXWPFRun newrun = paragraph.insertNewRun(i);//copy样式newrun.getCTR().setRPr(run.getCTR().getRPr());//换行newrun.addBreak();//缩进//newrun.addTab();newrun.setText(values[i]);}break;}else {run.setText(value,0);}}}}}/*** 替换表格对象方法* @param document docx解析对象* @param textMap 需要替换的信息集合//* @param tableList 需要插入的表格信息集合*/public static void changeTable(XWPFDocument document, Map<String, String> textMap,List<String[]> tableList){//获取表格对象集合List<XWPFTable> tables = document.getTables();for (int i = 0; i < tables.size(); i++) {//我的这里没有表头---------------//这是原来的注释:只处理 行数 大于等于2的 表格,且不循环表头XWPFTable table = tables.get(i);//if(table.getRows().size()>1){if(table.getRows().size()>0){//判断表格是需要替换还是需要插入,判断逻辑有$为替换,表格无$为插入if(checkText(table.getText())){List<XWPFTableRow> rows = table.getRows();//遍历表格,并替换模板eachTable(rows, textMap);//我的这里不需要插入}else{System.out.println("插入"+table.getText());if (tableList!=null&&tableList.size()>0){insertTable(table, tableList);}}}}}/*** 遍历表格* @param rows 表格行对象* @param textMap 需要替换的信息集合*/public static void eachTable(List<XWPFTableRow> rows ,Map<String, String> 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) {String value  = changeValue(run.toString(), textMap);//run.setText(value,0);//分段显示的情况String[] values = value.split("\n");if(values.length > 1) {run.setText(values[0],0);for (int i = 1; i < values.length; i++) {//存在分段则新建一个runXWPFRun newrun = paragraph.insertNewRun(i);//copy样式newrun.getCTR().setRPr(run.getCTR().getRPr());//换行newrun.addBreak();//缩进//newrun.addTab();newrun.setText(values[i]);}break;}else {run.setText(value,0);}}}}}}}/*** 为表格插入数据,行数不够添加新行* @param table 需要插入数据的表格* @param tableList 插入数据集合*/public static void insertTable(XWPFTable table, List<String[]> tableList){//创建行,根据需要插入的数据添加新行,不处理表头for(int i = 1; i <= tableList.size(); i++){XWPFTableRow row =table.createRow();}//遍历表格插入数据List<XWPFTableRow> rows = table.getRows();for(int i = 1; i < rows.size(); i++){XWPFTableRow newRow = table.getRow(i);List<XWPFTableCell> cells = newRow.getTableCells();for(int j = 0; j < cells.size(); j++){XWPFTableCell cell = cells.get(j);cell.setText(tableList.get(i-1)[j]);}}}/*** 判断文本中时候包含$* @param text 文本* @return 包含返回true,不包含返回false*/public static boolean checkText(String text){boolean check  =  false;if(text.indexOf("$")!= -1){//这个段落里检索到了$check = true;//走if()去替换}return check;//不走if(),无需替换}/*** 匹配传入信息集合与模板* @param value 模板需要替换的区域* @param textMap 传入信息集合* @return 模板需要替换区域信息集合对应值*/public static String changeValue(String value, Map<String, String> textMap){Set<Map.Entry<String, String>> textSets = textMap.entrySet();for (Map.Entry<String, String> textSet : textSets) {//匹配模板与替换值 格式${key}String key = "${"+textSet.getKey()+"}";if(value.indexOf(key)!= -1){//模板需要替换的区域中检索到了value = textSet.getValue();//替换成传入信息集合中的value}}//模板未匹配到区域替换为空if(checkText(value)){value = "";}return value;}}

poi操作word,写入一个图片,并且设置其大小,以及图片和base64之间的互相转换,以及表格内容替换和插入相关推荐

  1. java使用poi操作word模板,插入图片、段落、表格

    java使用poi操作word插入图片.段落.表格 其他链接 准备工作 创建word模板.docx文件 编写模板格式.xml文件 java上手poi maven依赖 使用到的包 具体应用 对应封装方法 ...

  2. POI操作word填充数据,合并多个word为一个,遇到一些问题的解决

    POI操作word填充数据,合并多个word为一个,遇到一些问题的解决 最近搞一个向word模板中替换占位符 填充数据,然后将多个word合并在一起的方法.网上一搜有很多资料,现在在这儿对过程中遇到的 ...

  3. poi设置word表格单元格宽度_xwpftable设置宽度;POI操作Word设置表格宽度

    poi 操作word里表格,如设置表格宽度.行高.表格样式等. 1.表格或单元格宽度: 默认TblW的type属性为STTblWidth.AUTO,即自动伸缩.所以要调整为指定类型:STTblWidt ...

  4. Poi 操作Word文档设置页边距 解决CTPageMar类找不到

    Poi操作Word文档设置页边距 CTPageMar类找不到 已解决 在百度上搜了一顿,找到了相关的解决方案,但是缺失了一个类,在百度怎么也找不到! 给大家一个参考数据 1厘米≈567 CTSectP ...

  5. 踩坑日记--poi操作word替换图片显示问题

    说明 最近遇到一个比较坑的问题,就是使用poi操作word文档,通过替换书签的方式替换成图片时,图片在word中显示正常,但是通过libreoffice转成pdf时显示不全.经过测试发现,图片插入到w ...

  6. POI操作Word设置表格在字体加粗【XWPFTableCell设置字体】Java操作Word调样式

    Jar包的版本号:[不同的版本号也许也可以,可以尝试一下,哈哈哈哈~] ----------因为代码在内网环境中无法复制出来,所以这里就截图了,兄弟们自己敲一下键盘吧~ POI操作Word设置表格在字 ...

  7. 报表技术2(百万数据导入导出,POI操作word)

    POI模板导出,操作word 导出用户详情数据(图片,公式处理) 使用模板导出用户详细信息 使用模板引擎 1.编写模板引擎 2.使用模板引擎 百万数据导出 代码实现: 百万数据导入 步骤分析: 1.自 ...

  8. poi操作word常用操作方法,word工具包

    poi操作word工具类 当前poi版本:3.17,升级版本写法略有差异 新版poi操作方法: - poi-5.2.2 操作word [段落] - poi-5.2.2 操作word [表格] - po ...

  9. poi操作word文档总结

    POI分段落生成纯Word动态模板并导入数据 导出数据,可以用word另存为xml格式的ftl文件,变量用${变量名}表示,然后在类中通过 freemarker去替换变量. 但是怎么导入word数据. ...

  10. POI操作Word文档工具

    POI操作Word文档工具 1.POI简单介绍 2.POI操作Word文档基本方法 3.POI操作Word文档基本方法应用 4.POI操作Word文档工具类 1.POI简单介绍 POIFS(可疑混淆执 ...

最新文章

  1. 华为201万年薪招毕业生!来自这些高校
  2. pytorch方法测试——损失函数(CrossEntropyLoss)
  3. java线程排序_Java中的并发排序
  4. linux gcc make cmake 三工具的关系
  5. This file can not be opened as a file descriptor; it is probably compressed
  6. python pytest allure_python测试框架pytest和测试报告allure的联合使用-----测试套件
  7. 编辑神器Vi介绍及常用命令
  8. minhash算法检索相似文本_基于向量的深层语义相似文本召回?你需要bert和faiss...
  9. 14张思维导图带你系统学习Python核心知识
  10. 在overleaf中使用中文
  11. chmod命令(chmod函数)自动清除设置用户ID位和设置组ID位
  12. Django---部署
  13. Atlas学习手记(21):使用行为增强用户界面(一):Click Behavior
  14. CSS3产生渐变效果
  15. 小米10手机电路图 主板元件位号图
  16. python开发微信公众号开发教程_python编写微信公众号首图思路详解
  17. ansys的kbc_ANSYS APDL 应用技巧
  18. 如何把一份pdf文件拆分为多个?
  19. 腾讯云轻量服务器蜂驰版测评及横向对比
  20. foxipdf和adobe_过去和将来的活动:Adobe Max North America和CFCAMP澳大利亚

热门文章

  1. 手写一个简单的mybatis
  2. 程序员加薪升职之全路径解析
  3. SCARA——OpenGL入门学习五六(三维变换、动画)
  4. ‘lengths‘ argument should be a 1D CPU int64 tensor, but got 1D cuda:0 Long tensor
  5. css样式鼠标放上去变成手的形状
  6. 迪士尼无限3.0连接服务器,迪士尼无限3period;0BUG问题解决 | 手游网游页游攻略大全...
  7. CSS | 盒模型的宽度计算规则
  8. 好用的空气质量查询API
  9. Rectangling Panoramic Images via Warping算法要点分析
  10. 【微信公众号】微信扫一扫,条形码/一维码,二维码功能解析