黑马程序员_Day02 __String、StringBuffer/Builder类与基本数据类型对象包装类

本文详细介绍了Java中的String类和StringBuffer类,包括它们的特点、构造方法、常用操作方法等,并通过实例讲解了如何使用这些方法来处理字符串。
-------  android培训java培 、期待与您交流! ----------


1、String类概述
String类是Java中专门对字符串进行操作的的类。String类被final所修饰,所以他不可以被继承所以String类中专门操作字符串的方法时不可以被覆写的。在Java 程序中的所有字符串字面值(如 "abc"、"540087")都是该类的具体对象,在双引号内。在日常生活中字符串出现的频率很高,在程序中操作也比较频繁所以String类中的方法要重点掌握。


2、String类的特点
通过查阅API,String类中有很多构造方法 有参数的和空参数的。因为String是一个特殊的类下面通过一个实例讲解:
(1)String s = new String();//该语句创建了一个字符串对象 s
(2)String s1 = " ";   //该语句也是创建了一个字符串对象s1 ,因为被双引号引起来的就是一个字符串对象,语句1和语句2的作用是相同的,但语句2更为简单,建议使用语句2创建字符串对象。
(3)String s2 = "abc";//该语句中s2是类类型变量,我们知道类类型变量指向对象,所以谁"abc"是一个字符串对象
(4)s2 = "sfdf"; //语句3和语句4中,对象的内容没有改变,是s2改变了一开始s2指向"abc"语句4执行完后s2指向了"sfdf"。字符串是一个常量也是一个对象。字符串最大的特点:一旦初始化成功就不能被改变。
(5)String s3 = new String("abc");
s2 == s3;结果是false,因为==比较的是内存地址值,因为s2是一个对象而s3是两个对象因为有new
s2.equals(s3);结果是true ,因为String类将Object中的equals方法覆写了,判断的是字符串的内容是否相同


3、String类中的方法
(1) 获取
1.1字符串中包含的字符数,也就是字符串长度
int length( );获取长度
1.2根据位置获取该位置上的字符
char charAt(int  index);
1.3根据字符获取该字符在字符串中的位置
int indexOf(int  ch);//ch 代表ASCII码 并且返回的是ch在字符串中首次出现的位置
intindexOf(int  ch,int fromIndex);从指定位置fromIndex开始获取ch在字符串中出现的位置
int indextOf(String str);返回的是str在字符串中第一次出现的位置
int indexOf(String str,int formIndex);从指定位置fromIndex开始获取str在字符串中出现的位置
1.4反向获取(角标不会变只是从后向前查找)
int  lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引
 int  lastIndexOf(int ch, int fromIndex) 返回指定字符在字符串中最后一次出现处的位置
 int  lastIndexOf(String str) 返回指定子字符串在此字符串中最右边出现处的索引。
 int  lastIndexOf(String str, int fromIndex) 返回指定子字符串在此字符串中最后一次出现处的位置
1.5  获取子串
String substring(int beginIndex)  //从指定位置到结尾,有角标越界异常
String substring(int beginIndex, int endIndex) //包含头不包含尾
(2)判断
2.1 字符串中是否包含某个子串
booleancontains(CharSequence   s);//特殊之处indexOf(String  str)可以索引str子串第一次出现的位置,如果返回-1表示该str子串不在字符串中存在,所以也可以对指定字符串判断是否包含,方法是 if(str.indexOf("aa") != -1),而且该方法即可以判断又可获取出现的位置。如果只为判断就用contains(),如果及判断又拿位置就用 indexOf()进行操作。
2.2 在字符串中是否有内容
booleanisEmpty();原理就是判断长度是否为0
2.3 字符串是否是以指定内容开头
booleanstartWith(str);
2.4字符串是否是以指定内容结尾
booleanendsWith(str);
2.5 判断字符串中内容是否相同
boolean equals(Object anObject)//此方法覆写了Object中的equals方法
2.6 判断内容是否相同,并忽略大小写
boolean  equalsIgnoreCase(String  anotherString);
判断文件名:
String str = "ArrayDemo.java";
//判断文件名称中是否是Array单词开头
str.startWith("Array");
//判断文件名称中是否是.java字符串结尾
str.endsWith(".java");
//判断文件中是否包含Demo
str.contains("Demo");
(3)转换
3.1 将字符数组转换为字符串
通过构造函数:String (char [ ] )
    String (char[ ],offset起始位,count 个数)//将字符数组中的一部分转成字符串
通过静态方法:String copyValueOf(char[ ]);
   String copyValueOf(char[ ],offset起始位,count 个数);
3.2将字符串转成字符数组
char [ ]toCharArray();
3.3  将字节数组转换为字符串
通过构造函数:String (byte [ ] )
    String (byte[ ],offset起始位,count 个数)//将字符数组中的一部分转成字符串
3.4 将字符串转成字节数组(在转换过程中是可以指定编码表的)
byte[ ]getBytes();
3.5 将基本数据类型转成字符串
staticString valueOf( int );
staticString valueOf( double );
3.6 将字符串转成大写或小写
StringtoUpperCase();//转成大写
StringtoLowerCase();//转成小写


(4)替换
4.1 String replace(oldChar,newChar);//可以替换一个字符也可以替换一个字符串,如果要替换的字符不存在则     //返回原字符串
(5)切割
5.1  String[ ]split(String  regex);//切割之后返回一个字符串数组
eg:   String  s = "zhangsan,lisi,wangwu";
String [ ] arr  = s.split(",");//用逗号对字符串进行切割
(6)去空格 与 比较
6.1 将字符串两端的空格去除
String trim();
6.2 对两个字符串进行自然顺序比较
int  compareTo(String anotherString) // 按字典顺序比较两个字符串。 
  int  compareToIgnoreCase(String str) // 按字典顺序比较两个字符串,不考虑大小写
注意:字符串的比较是把字符串从开始到结束的每一位拿出来作比较,具体做法是取出相同位置上的字符做减法运算,如果不为0,则认为两个字符串不相等,把相减的差返回如果字符串按顺序比较完了,且长度相同,则返回0表示相等如果长度不相同,则返回的是两个字符串长度的差。
因此:
返回值小于0,则左边小于右边
返回值等于0,则左边等于右边
返回值大于0,则左边大于右边


 4、字符串练习
/*
需求1:自定义String中去除空格的方法trim


思路:给定一个字符串,定义两个指针一个指针从头开始判断,如果等于空指针就自增继续判断下一个,
另一个指针从尾部开始判断,如果等于空,指针就自减继续判断下一个,但两个指针之间得保持
距离即从头开始的指针不能大于从尾部开始的指针,当判断结束后通过String中获取子串的方法
对字符串进行获取,切记获取子串包含头不包含尾。


步骤:1、定义两个指针即变量
  2、通过while循环对字符串遍历判断(条件是一个自增一个自减,之间保持距离)
  3、通过String中获取子串的方法 substring(头,尾)包含头不包含尾
*/
class myTrim 
{
public static void main(String[] args) 
{
String s = "   abcd   ";
System.out.println(s);
System.out.println(MyTrim(s));
}


public static String MyTrim(String str)
{
int start=0,last=str.length()-1;
while(start<=last && str.charAt(start)==' ')
start++;
while(start<=last && str.charAt(last)==' ')
last--;
return str.substring(start,last+1);
}
}
-----------------------------------------------------------------------------------------------------------
5、StringBuffer类
 StringBuffer是一个字符串缓冲区,是一个容器,而且长度是可变化的可以操作多个数据类型,最终会通过toString方法变成字符串。
StringBuffer是一个容器,顾名思义容器容器就是装东西的东西,无论往里面装东西还是往外取东西,自己还是个容器,引用毕姥爷的话就是面盆理论。
StringBuffer被初始化后可以改变而String一但初始化就不能被改变。


6、StringBuffer中的方法
容器具备增、删、改、查的特点:
1、存储
StringBufferappend();将指定数据作为参数添加到已有数据结尾处
eg:sb.append("abc").append("true").append("34").append("2.0");//方法调用链


2、插入
StringBufferinsert( int index将要插入的位置,任意数据)//可以将数据插入到指定index位置,注意:角标越界


3、删除
StringBufferdelete(start,end)//删除缓冲区中的内容,包含头不包含尾
StringBufferdeleteCharAt(int indext);//删除指定位置的字符
清空缓冲区原理:
sb.delete(0,sb.length());//从0开始到结尾


4、获取
char charAt(int   index);//根据位置获取字符
int indexOf(String  str);//根据字符串获取位置
int lastIndexOf(String str);//倒序获取字符串的位置
int length( );//返回长度(字符数)
String substring(int  start,int end);//返回子串


5、修改
StringBufferreplace(int start , int end,String)//替换指定位置的字符串,包含头不包含尾
void setCharAt(int index ,char  ch)//将指定位置处的字符设置为 ch


6、反转
StringBufferreverse( );// 将此字符序列用其反转形式取代


7、将缓冲区中指定数据存储到指定字符数组中
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
7、StringBuilder
在JDK1.5版本以后出现了StringBuilder,但StringBuilder和StringBuffer中的方法相同,只不过StringBuffer是线程同步而StringBuilder线程不同步。如果将StringBuilder的实例用于多个线程是不安全的,如果需要这样的同步建议用StringBuffer。但在单线程中用StringBuilder。


8、java升级的几个因素
1、提高效率
2、简化书写
3、提高安全性


9、基本数据类型对象包装类
1、在Java中为了操作基本数据类型更加方便高效,Java为我们提供了基本数据类型对象包装类,通过对象包装类我们就能更容易的操作任何一种数据类型,比如整型的最大值、进制问题等等。
2、基本数据类型对应的包装类形式
一般都是首字母大写但是int和char不同,他们的表现形式是Integer和Character




  3、基本数据类型包装类的常见作用主要用于:基本数据类型和字符串类型之间的转换(网站文本中年龄)
基本数据类型转换成字符串类型
1、基本数据类型 + " ";
2、静态方法:基本数据类型 . toString(基本数据类型值);
eg:Integer . toString(34);//将整型34转换成字符串"34"
3、非静态方法
int   intValue( );
字符串转换成基本数据类型
1、常见格式Xxx a = Xxx.parseXxx(String);
eg:int  a  = Integer . parseInt("123");//如果是"a123"提示数据格式错误,所以必须传入数字格式的字符串
      boolean  b  =  Boolean.parse("true");
4、进制转换
十进制转其他进制
static String toBinaryString(int i) //十进制转二进制
           以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。 
static String toHexString(int i) //十进制转十六进制
           以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。 
static String toOctalString(int i) //十进制转八进制
           以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。
其他进制转十进制
static int parseInt(String s, int radix)   //String s代表进制表现形式"3C"   int radix代表几进制
eg:parseInt("3C",16);


10、基本数据对象包装类新特性
在JDK1.5版本以后基本数据对象包装类出现了一些新特性:自动装箱和自动拆箱
eg:Integer  x = 4;// x是类类型变量所以指向对象,所以该语句隐式将4隐式转换成了Integer即自动装箱
x = x + 4;//此语句中先将x自动拆箱与x进行运算,结果是整型,在自动装箱赋值给x。
在新特性中Integer x中x是引用数据类型所以它还有另一个值即null,在装箱拆箱过程中调用了方法,所以在使用时应先判断,不为null再进行运算否则会报错误。
小知识点:
Integer m = 128;
Integer n = 128;
System.out.println("m==n结果是"+m==n);//j结果是false对象不同
Integer a = 127;
Integer b = 127;
System.out.println("a==b结果是"+a==b);//结果是true,因为a和b指向的是同一个Integer对象
//因为当数值在byte的取值范围内(-128~127),对于新特性,如果该值已经存在,则不会开辟空间


总结: 对于String类和StringBuffer等类多看API多写多记,对于方法应熟练掌握。

------- android培训java培、期待与您交流! ----------

public void createSpecificationOutputFromTemplateHttpWithOperateFlagMany(HttpServletRequest request, HttpServletResponse response, SpecificationData articleData) { if (articleData==null){ log.warn("勾选物料规格书模板内容生成word文档的参数为空,不作处理,返回。"); return; } String resourcePath = System.getProperty("user.dir") + "/src/main/resources/"; log.info("项目resource路径 resourcePath:"+resourcePath); String templePath = resourcePath+"templates/"+articleData.getTemplateType()+".docx"; String templePathAnnex = resourcePath+"templates/specificationAnnex.docx"; Style styleBold = Style.builder().buildBold().build(); TextRenderData xStr = new TextRenderData("×", styleBold); TextRenderData yStr = new TextRenderData("√", styleBold); // 存储成格式 aa;bb;cc,前端则是需要分解成数组的格式显示 StringBuffer sb_materialUseType = new StringBuffer(); StringBuffer sb_environmentalReq = new StringBuffer(); StringBuffer sb_materialCert = new StringBuffer(); Map<String, Object> wordData = new HashMap<>(); wordData.put("materialCode", articleData.getMaterialCode()); wordData.put("materialName", articleData.getMaterialName()); wordData.put("materialVersion", articleData.getMaterialVersion()); wordData.put("projectName", articleData.getProjectName()); wordData.put("materialColor", articleData.getMaterialColor()); wordData.put("materialType", articleData.getMaterialType()); wordData.put("materialUseType", articleData.getMaterialUseTypeList()); if(articleData.getMaterialUseTypeList()!=null&&articleData.getMaterialUseTypeList().length>0){ boolean sflag = false; boolean uflag = false; for(String UseType : articleData.getMaterialUseTypeList()){ if("专用".equals(UseType)){ wordData.put("suse", yStr); sflag = true; sb_materialUseType.append(UseType+";"); } if("通用".equals(UseType)){ wordData.put("nuse", yStr); uflag = true; sb_materialUseType.append(UseType+";"); } } if(!sflag){ wordData.put("suse", " "); } if(!uflag){ wordData.put("nuse", " "); } }else{ wordData.put("suse", " "); wordData.put("nuse", " "); } // 1、基本要求 wordData.put("material", articleData.getMaterial()); wordData.put("adhesiveNum", articleData.getAdhesiveNum()); wordData.put("surfaceTreatment", articleData.getSurfaceTreatment()); wordData.put("operatingTemp", articleData.getOperatingTemp()); wordData.put("unit", articleData.getUnit()); wordData.put("focusControlSize", articleData.getFocusControlSize()); wordData.put("appearance", articleData.getAppearance()); wordData.put("notes1", StringUtils.isNotBlank(articleData.getNotes1())?articleData.getNotes1():""); // 2、测试要求 wordData.put("peelAdhesion180", articleData.getPeelAdhesion180()); wordData.put("releaseForce", articleData.getReleaseForce()); wordData.put("alcoholAbrasionResistance", articleData.getAlcoholAbrasionResistance()); wordData.put("fireTest", articleData.getFireTest()); wordData.put("tack", articleData.getTack()); wordData.put("retention", articleData.getRetention()); wordData.put("notes2", StringUtils.isNotBlank(articleData.getNotes2())?articleData.getNotes2():""); // F-SUN5-DP-10.1.27-A1 物料规格书(冲压件即五金镍片铜片) 模板的数据================================ wordData.put("ha1", StringUtils.isNotBlank(articleData.getHa1())?articleData.getHa1():"/"); wordData.put("ha2", StringUtils.isNotBlank(articleData.getHa2())?articleData.getHa2():"/"); wordData.put("ha3", StringUtils.isNotBlank(articleData.getHa3())?articleData.getHa3():"/"); wordData.put("ha4", StringUtils.isNotBlank(articleData.getHa4())?articleData.getHa4():"/"); wordData.put("ha5", StringUtils.isNotBlank(articleData.getHa5())?articleData.getHa5():"/"); wordData.put("ha6", StringUtils.isNotBlank(articleData.getHa6())?articleData.getHa6():"/"); wordData.put("hb1", StringUtils.isNotBlank(articleData.getHb1())?articleData.getHb1():"/"); wordData.put("hb2", StringUtils.isNotBlank(articleData.getHb2())?articleData.getHb2():"/"); wordData.put("hb3", StringUtils.isNotBlank(articleData.getHb3())?articleData.getHb3():"/"); wordData.put("hb4", StringUtils.isNotBlank(articleData.getHb4())?articleData.getHb4():"/"); wordData.put("hb5", StringUtils.isNotBlank(articleData.getHb5())?articleData.getHb5():"/"); wordData.put("hb6", StringUtils.isNotBlank(articleData.getHb6())?articleData.getHb6():"/"); wordData.put("auth3c", StringUtils.isNotBlank(articleData.getAuth3c())?articleData.getAuth3c():"×"); String basic_requirements = wordData.get("ha1")+"##"+wordData.get("ha2")+"##"+wordData.get("ha3") +"##"+wordData.get("ha4")+"##"+wordData.get("ha5")+"##"+wordData.get("ha6"); String test_requirements = wordData.get("hb1")+"##"+wordData.get("hb2")+"##"+wordData.get("hb3") +"##"+wordData.get("hb4")+"##"+wordData.get("hb5")+"##"+wordData.get("hb6"); if(!basic_requirements.equals("/##/##/##/##/##/")){ articleData.setBasicRequirements(basic_requirements); articleData.setTestRequirements(test_requirements); } // =============================================================================================== // 3、环保要求 wordData.put("environmentalReq", articleData.getEnvironmentalReqList()); //环保要求 ['RoHS2.0', 'REACH', 'CP65', '无卤'] if(articleData.getEnvironmentalReqList()!=null&&articleData.getEnvironmentalReqList().length>0){ boolean envReq1 = false; boolean envReq2 = false; boolean envReq3 = false; boolean envReq4 = false; boolean envReq5 = false; for(String UseType : articleData.getEnvironmentalReqList()){ if("RoHS2.0".equals(UseType)){ wordData.put("RoHS2", yStr); envReq1 = true; sb_environmentalReq.append(UseType+";"); } if("REACH".equals(UseType)){ wordData.put("REACH", yStr); envReq2 = true; sb_environmentalReq.append(UseType+";"); } if("CP65".equals(UseType)){ wordData.put("CP65", yStr); envReq3 = true; sb_environmentalReq.append(UseType+";"); } if("无卤".equals(UseType)){ wordData.put("wulu", yStr); envReq4 = true; sb_environmentalReq.append(UseType+";"); } if("其它".equals(UseType)){ wordData.put("other", yStr); envReq5 = true; sb_environmentalReq.append(UseType+";"); } } if(!envReq1){ wordData.put("RoHS2", xStr); } if(!envReq2){ wordData.put("REACH", xStr); } if(!envReq3){ wordData.put("CP65", xStr); } if(!envReq4){ wordData.put("wulu", xStr); } if(!envReq5){ wordData.put("other", xStr); } }else{ wordData.put("RoHS2", xStr); wordData.put("REACH", xStr); wordData.put("CP65", xStr); wordData.put("wulu", xStr); wordData.put("other", xStr); } wordData.put("specialReq", articleData.getSpecialReq()); wordData.put("notes3", StringUtils.isNotBlank(articleData.getNotes3())?articleData.getNotes3():""); // 4、安规要求 wordData.put("ulAuth", StringUtils.isNotBlank(articleData.getUlAuth())?articleData.getUlAuth():"×"); wordData.put("ceAuth", StringUtils.isNotBlank(articleData.getCeAuth())?articleData.getCeAuth():"×"); wordData.put("notes4", StringUtils.isNotBlank(articleData.getNotes4())?articleData.getNotes4():""); // 5、包装要求 wordData.put("safetyLabel", StringUtils.isNotBlank(articleData.getSafetyLabel())?articleData.getSafetyLabel():"无"); wordData.put("materialCert", articleData.getMaterialCertList()); if(articleData.getMaterialCertList()!=null&&articleData.getMaterialCertList().length>0){ boolean sflag = false; boolean uflag = false; for(String UseType : articleData.getMaterialCertList()){ if("是".equals(UseType)){ wordData.put("materialCertYes", "■"); sflag = true; sb_materialCert.append(UseType+";"); } if("否".equals(UseType)){ wordData.put("materialCertNo", "■"); uflag = true; sb_materialCert.append(UseType+";"); } } if(!sflag){ wordData.put("materialCertYes", "□"); } if(!uflag){ wordData.put("materialCertNo", "□"); } }else{ wordData.put("materialCertYes", "□"); wordData.put("materialCertNo", "□"); } //Style style = Style.builder().buildColor("FF0000").buildBold().build(); Style style = Style.builder().buildColor("FF0000").build(); wordData.put("packagRuleInner", new TextRenderData(articleData.getPackagRuleInner(), style)); wordData.put("packagRuleOuter", new TextRenderData(articleData.getPackagRuleOuter(), style)); wordData.put("amountInner", new TextRenderData(articleData.getAmountInner(), style)); wordData.put("amountOuter", new TextRenderData(articleData.getAmountOuter(), style)); wordData.put("otherProtectiveReq", new TextRenderData(articleData.getOtherProtectiveReq(), style)); wordData.put("notes5", StringUtils.isNotBlank(articleData.getNotes5())?articleData.getNotes5():""); // 添加附件图片,在word模版中的占位符:{{@picture}} boolean hava_annex = false; if(StringUtils.isNotBlank(articleData.getFileLocalPath())){ try { // ‪D:\Users\2104020051\Desktop\电池管理平台1.png E:/ruoyi/uploadPath/upload/2024/09/20/20250211091000982.png //PictureBuilder pb = Pictures.ofStream(new FileInputStream("E:/ruoyi/uploadPath/upload/2024/09/20/20250211091000982.png"), PictureType.JPEG); //wordData.put("picture",Pictures.ofStream(new FileInputStream("E:/ruoyi/uploadPath/upload/2024/09/20/20250211091000982.png"), PictureType.JPEG) //.size(900, 540).create()); if(articleData.getFileLocalPath().toLowerCase().endsWith(".png") || articleData.getFileLocalPath().toLowerCase().endsWith(".jpeg") || articleData.getFileLocalPath().toLowerCase().endsWith(".jpg")){ BufferedImage bufferImage = ImageIO.read(new FileInputStream(articleData.getFileLocalPath())); // 获取的长宽数值较大,避免插入图片过大,我等比例缩小了10倍 int width = bufferImage.getWidth(); int height = bufferImage.getHeight(); int rate_width = (int) (740*(Double.parseDouble(height+"")/width)); wordData.put("picture",Pictures.ofStream(new FileInputStream(articleData.getFileLocalPath()), PictureType.JPEG) .size(740, rate_width).create()); hava_annex = true; //map.put("bufferImagePicture", new PictureRenderData(100, 120, ".png", bufferImage)); }else if(articleData.getFileLocalPath().toLowerCase().endsWith(".pdf")){ // pdf转图片后插入word String pdfPath = articleData.getFileLocalPath(); // PDF file path // pdf只有一页情况,不适合了======================== // int pageNumber = 0; // Page number to convert (starting from 0) // BufferedImage bufferImage = PoiWordUtil.convertPdfPageToImage(pdfPath, pageNumber); // Convert PDF page to image // // 获取的长宽数值较大,避免插入图片过大,我等比例缩小了10倍 // int width = bufferImage.getWidth(); // int height = bufferImage.getHeight(); // int rate_width = (int) (740*(Double.parseDouble(height+"")/width)); // Pictures.ofBufferedImage(bufferImage, PictureType.JPEG); // wordData.put("picture", Pictures.ofBufferedImage(bufferImage, PictureType.JPEG).size(740, rate_width).create()); //================================================ // 以下多页的情况也可以 PDDocument document = PDDocument.load(new File(pdfPath)); int num = document.getNumberOfPages();// pdf页数 if(document!=null && num>0){ List<Map<String, Object>> picture_list = new ArrayList<Map<String, Object>>(); for(int pageNumber=0;pageNumber<num;pageNumber++){ BufferedImage bufferImage = PoiWordUtil.convertPdfPageToImage(pdfPath, pageNumber); // Convert PDF page to image // 获取的长宽数值较大,避免插入图片过大,等比例缩小了10倍 int mywidth = 750; int myheight = 950; int width = bufferImage.getWidth(); int height = bufferImage.getHeight(); int rate_height = (int) (750*(Double.parseDouble(height+"")/width)); if(rate_height > 950){ myheight = 950; mywidth = (int) (950*(Double.parseDouble(width+"")/height)); }else{ mywidth = 750; myheight = rate_height; } Pictures.ofBufferedImage(bufferImage, PictureType.JPEG); //wordData.put("picture", Pictures.ofBufferedImage(bufferImage, PictureType.JPEG).size(740, rate_width).create()); Map<String, Object> picture_map = new HashMap<String, Object>(); picture_map.put("picture", Pictures.ofBufferedImage(bufferImage, PictureType.JPEG).size(mywidth, myheight).create()); picture_list.add(picture_map); } if(picture_list!=null && picture_list.size()>0){ wordData.put("pictureList",picture_list); } } hava_annex = true; }else{ log.warn("没有附件的物料规格书导出,或附件不是图片、pdf"); hava_annex = false; } } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } // 6、电气性能要求 // 电气性能要求的数据 articleData.setElectricalReq(StringUtils.isNotBlank(articleData.getElectricallistJson())?articleData.getElectricallistJson():""); List<SpecificationElectricalPerformance> myElectricalList = new ArrayList<SpecificationElectricalPerformance>(); ArrayList<Map<String, Object>> workElectricalList = CollUtil.newArrayList(); if(StringUtils.isNotBlank(articleData.getElectricallistJson())){ myElectricalList = JSON.parseArray(articleData.getElectricallistJson().toString(), SpecificationElectricalPerformance.class); if(myElectricalList!=null && myElectricalList.size()>0){ for (int i = 0; i < myElectricalList.size(); i++) { SpecificationElectricalPerformance changeRecord = myElectricalList.get(i); // 模拟从mysql查询列表数据 HashMap<String, Object> workItem = new HashMap<>(); workItem.put("no1", StringUtils.isNotBlank(changeRecord.getNo1())?changeRecord.getNo1():""); workItem.put("content1", StringUtils.isNotBlank(changeRecord.getContent1())?changeRecord.getContent1():""); workItem.put("paramstandards1", StringUtils.isNotBlank(changeRecord.getParamstandards1())?changeRecord.getParamstandards1():""); workItem.put("remark1", StringUtils.isNotBlank(changeRecord.getRemark1())?changeRecord.getRemark1():""); workItem.put("no2", StringUtils.isNotBlank(changeRecord.getNo2())?changeRecord.getNo2():""); workItem.put("content2", StringUtils.isNotBlank(changeRecord.getContent2())?changeRecord.getContent2():""); workItem.put("paramstandards2", StringUtils.isNotBlank(changeRecord.getParamstandards2())?changeRecord.getParamstandards2():""); workItem.put("remark2", StringUtils.isNotBlank(changeRecord.getRemark2())?changeRecord.getRemark2():""); workElectricalList.add(workItem); } }else{ // 如果时空的,就另外添加一行控制填充 HashMap<String, Object> workItem = new HashMap<>(); workItem.put("no1", ""); workItem.put("content1", ""); workItem.put("paramstandards1", ""); workItem.put("remark1", ""); workItem.put("no2", ""); workItem.put("content2", ""); workItem.put("paramstandards2", ""); workItem.put("remark2", ""); workElectricalList.add(workItem); } }else{ // 如果时空的,就另外添加一行控制填充 HashMap<String, Object> workItem = new HashMap<>(); workItem.put("no1", ""); workItem.put("content1", ""); workItem.put("paramstandards1", ""); workItem.put("remark1", ""); workItem.put("no2", ""); workItem.put("content2", ""); workItem.put("paramstandards2", ""); workItem.put("remark2", ""); workElectricalList.add(workItem); } wordData.put("electricallist", workElectricalList); wordData.put("notes6", StringUtils.isNotBlank(articleData.getNotes6())?articleData.getNotes6():""); //注意事项 wordData.put("precautions", StringUtils.isNotBlank(articleData.getPrecautions())?articleData.getPrecautions():""); // 7.添加变更记录 // List<SpecificationChangeRecord> syy = articleData.getMylist(); // SpecificationChangeRecord myObjectList = JSON.parseObject(articleData.getMylist().get(0), SpecificationChangeRecord.class); List<SpecificationChangeRecord> myObjectList = new ArrayList<SpecificationChangeRecord>(); ArrayList<Map<String, Object>> workList = CollUtil.newArrayList(); if(StringUtils.isNotBlank(articleData.getMylistJson())){ myObjectList = JSON.parseArray(articleData.getMylistJson().toString(), SpecificationChangeRecord.class); if(myObjectList!=null && myObjectList.size()>0){ for (int i = 0; i < myObjectList.size(); i++) { SpecificationChangeRecord changeRecord = myObjectList.get(i); // 模拟从mysql查询列表数据 HashMap<String, Object> workItem = new HashMap<>(); workItem.put("number", i + 1); workItem.put("changeDate", DateUtils.parseDateToStr("yyyy-MM-dd", changeRecord.getChangeDate())); workItem.put("version", StringUtils.isNotBlank(changeRecord.getVersion())?changeRecord.getVersion():""); workItem.put("changeContent", StringUtils.isNotBlank(changeRecord.getChangeContent())?changeRecord.getChangeContent():""); workItem.put("fiction", StringUtils.isNotBlank(changeRecord.getFiction())?changeRecord.getFiction():""); workItem.put("review", StringUtils.isNotBlank(changeRecord.getReview())?changeRecord.getReview():""); workItem.put("approve", StringUtils.isNotBlank(changeRecord.getApprove())?changeRecord.getApprove():""); workItem.put("remark", StringUtils.isNotBlank(changeRecord.getRemark())?changeRecord.getRemark():""); workList.add(workItem); } } } wordData.put("changeList", workList); //2、配置格式,包括字体颜色设置等 //Style style = Style.builder().buildColor("00FF00").buildBold().build(); //wordData.put("ces7", new TextRenderData(articleData.getAppearance(), style)); //3、超链接 //wordData.put("website", new HyperlinkTextRenderData("website.", "http://www.baidu.com")); // 添加图片,在word模版中的占位符:{{@picture}} // try { // // ‪D:\Users\2104020051\Desktop\电池管理平台1.png // wordData.put("picture",Pictures.ofStream(new FileInputStream("E:/ruoyi/uploadPath/upload/2024/09/20/20250211091000982.png"), PictureType.JPEG) // .size(600, 360).create()); // } catch (FileNotFoundException e1) { // // TODO Auto-generated catch block // e1.printStackTrace(); // } // PoiWordUtil.createDocxFromTemple(wordData, "D:\\Users\\2104020051\\Desktop\\一些文件\\富文本导入导出\\word模版测试\\F-SUN5-DP-10.1.26-A1 物料规格书(PC片泡棉即模切).docx" // , "D:\\Users\\2104020051\\Desktop\\一些文件\\富文本导入导出\\word模版测试\\物料规格书_"+DateUtils2.getMillis(new Date())+".docx"); //PoiWordUtil.createDocxFromTempleHttp(wordData, templePath, request, response); if(hava_annex){ // 添加附件 PoiWordUtil.createDocxFromTempleHttpWithAnnex(wordData, templePath,templePathAnnex, request, response); }else{ PoiWordUtil.createDocxFromTempleHttp(wordData, templePath, request, response); } if(articleData.getOperateFlag().intValue()>0){ // 0.导出文档(不入库) 1.新增 2.修改 3.复制 if(articleData.getOperateFlag().intValue()==2){ // 修改 // 1.从数据库中获取附件路径,看是否是改变附件,改变了就删除旧的附件 SpecificationData myData = specificationDataService.selectSpecificationDataById(articleData.getId()); if(StringUtils.isNotBlank(myData.getFileLocalPath()) && !myData.getFileLocalPath().equals(articleData.getFileLocalPath())){ boolean deleteFlag = FileUtil.deleteFile(myData.getFileLocalPath()); if (deleteFlag) { log.info("规格书附件变更了,删除旧附件成功,旧附件: [{}],新附件: [{}]。", myData.getFileLocalPath(),articleData.getFileLocalPath()); } else { log.warn("规格书附件变更了,删除旧附件失败!!! 旧附件: [{}],新附件: [{}]。", myData.getFileLocalPath(),articleData.getFileLocalPath()); } } // 图档删除 if(StringUtils.isNotBlank(myData.getDwgLocalPath()) && !myData.getDwgLocalPath().equals(articleData.getDwgLocalPath())){ boolean deleteFlag = FileUtil.deleteFile(myData.getDwgLocalPath()); if (deleteFlag) { log.info("规格书关联图档变更了,删除旧图档成功,旧图档附件: [{}],新图档附件: [{}]。", myData.getDwgLocalPath(),articleData.getDwgLocalPath()); } else { log.warn("规格书关联图档变更了,删除旧图档失败!!! 旧图档附件: [{}],新图档附件: [{}]。", myData.getDwgLocalPath(),articleData.getDwgLocalPath()); } } // 2.修改数据入库 log.info("生成文档已导出,数据入库准备..."); LoginUser loginUser = SecurityUtils.getLoginUser(); articleData.setUpdateBy(loginUser.getUsername()); articleData.setDeptId(SecurityUtils.getDeptId()); // 用于查询的时候,只能看同部门的文档 articleData.setMaterialUseType(sb_materialUseType.toString()); articleData.setEnvironmentalReq(sb_environmentalReq.toString()); articleData.setMaterialCert(sb_materialCert.toString()); //articleData.setDataVersion(Constants.VERSION_INIT);// 记录初始版本 double new_version = StringUtils.isNotBlank(articleData.getDataVersion())? Double.parseDouble(articleData.getDataVersion().trim())+0.1:Double.parseDouble(Constants.VERSION_INIT); // 保持一位小数 BigDecimal b = new BigDecimal(new_version); double the_version = b.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue(); articleData.setDataVersion(the_version+""); int update_flag = specificationDataService.updateSpecificationData(articleData); if(update_flag>0){ log.info("规格书文档数据修改入库[specificationData]完成,准备更新变更记录数据..."); // 3.变更记录数据更新 // 3.1获取对应的变更记录 SpecificationChangeRecord specificationChangeRecord = new SpecificationChangeRecord(); specificationChangeRecord.setSpecificationDataId(articleData.getId()); specificationChangeRecord.setMaterialCode(articleData.getMaterialCode()); List<SpecificationChangeRecord> record_list = specificationChangeRecordMapper.selectSpecificationChangeRecordList(specificationChangeRecord); boolean isExist = record_list!=null && record_list.size()>0; //是否存在原始变更记录 List<Long> updateIds = new ArrayList<Long>(); if(myObjectList!=null && myObjectList.size()>0){ Long specificationDataId = articleData.getId(); for (SpecificationChangeRecord changeRecord : myObjectList) { if(changeRecord.getId()==null || changeRecord.getId()<=0){ // 没有id,插入数据 changeRecord.setSpecificationDataId(specificationDataId); changeRecord.setMaterialCode(articleData.getMaterialCode()); changeRecord.setCreateBy(loginUser.getUsername()); changeRecord.setDeptId(SecurityUtils.getDeptId()); // 用于查询的时候,只能看同部门的文档 specificationChangeRecordService.insertSpecificationChangeRecord(changeRecord); }else{ changeRecord.setSpecificationDataId(specificationDataId); changeRecord.setMaterialCode(articleData.getMaterialCode()); changeRecord.setUpdateBy(loginUser.getUsername()); changeRecord.setDeptId(SecurityUtils.getDeptId()); // 用于查询的时候,只能看同部门的文档 specificationChangeRecordService.updateSpecificationChangeRecord(changeRecord); updateIds.add(changeRecord.getId()); } } log.info("更新变更记录数据入库[specificationChangeRecord]完成.."); } if(isExist){ // 存在原始变更记录 for(SpecificationChangeRecord therecord : record_list){ if(updateIds!=null && updateIds.size()>0){ boolean myup = false; for(Long recordid : updateIds){ if(recordid.equals(therecord.getId())){ myup = true; break; } } if(!myup){ specificationChangeRecordMapper.deleteSpecificationChangeRecordById(therecord.getId()); } }else{ specificationChangeRecordMapper.deleteSpecificationChangeRecordById(therecord.getId()); } } } } }else if(articleData.getOperateFlag().intValue()==1 || articleData.getOperateFlag().intValue()==3){ // 新增和复制,都是添加新的记录 // 数据入库 log.info("生成文档已导出,数据入库准备..."); LoginUser loginUser = SecurityUtils.getLoginUser(); articleData.setDelFlag("N"); articleData.setCreateBy(loginUser.getUsername()); articleData.setDeptId(SecurityUtils.getDeptId()); // 用于查询的时候,只能看同部门的文档 articleData.setMaterialUseType(sb_materialUseType.toString()); articleData.setEnvironmentalReq(sb_environmentalReq.toString()); articleData.setMaterialCert(sb_materialCert.toString()); articleData.setDataVersion(Constants.VERSION_INIT);// 记录初始版本 specificationDataService.insertSpecificationData(articleData); log.info("数据入库[specificationData]完成.."); if(myObjectList!=null && myObjectList.size()>0){ Long specificationDataId = articleData.getId(); for (SpecificationChangeRecord changeRecord : myObjectList) { changeRecord.setSpecificationDataId(specificationDataId); changeRecord.setMaterialCode(articleData.getMaterialCode()); changeRecord.setCreateBy(loginUser.getUsername()); changeRecord.setDeptId(SecurityUtils.getDeptId()); // 用于查询的时候,只能看同部门的文档 specificationChangeRecordService.insertSpecificationChangeRecord(changeRecord); } log.info("数据入库[specificationChangeRecord]完成.."); } log.info("数据入库全部完成."); }else{ log.warn("不支持的物料规格书操作.OperateFlag="+articleData.getOperateFlag()); } } }。 handleCreateArticleOutputHttp(row) { // alert("mylist="+this.info.mylist[0].changeDate) // const ids = row.id || this.ids; // this.form.ids = ids; // this.form.notesExportFlag = 1; //1-要导出备注详细 this.info.mylistshow = this.info.mylist this.info.mylistJson = JSON.stringify(this.info.mylist); // 将对象数组转成json传送到java后台处理,以防传送到后台是字符串‘Object’ this.info.mylist=[] this.info.electricallistshow = this.info.electricallist this.info.electricallistJson = JSON.stringify(this.info.electricallist); // 将对象数组转成json传送到java后台处理,以防传送到后台是字符串‘Object’ this.info.electricallist=[] let timestamp = new Date().getTime(); // 例如:1609459200000 let date = new Date(timestamp); // let formatDate = date.toLocaleString('en-US', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }); let formatDate = date.toLocaleString('en-US', { year: 'numeric', month: '2-digit', day: '2-digit' }); // alert(formatDate) let formattedDate = formatDate.replaceAll('/','').replaceAll(':','').replaceAll('_','').replaceAll(',','').replaceAll(' ',''); // alert(formattedDate) let subDate = formattedDate.substring(4)+formattedDate.substring(0, 4) // alert(subDate) // 例如:"12/03/2021, 10:40:00" let word_name=`${this.info.materialCode}_${this.info.projectName}_${this.info.materialName}物料规格书_${this.info.materialVersion}_${subDate}.docx`; this.download('cms/data/createSpecificationOutputHttp', { ...this.info }, word_name, { timeout: 60000 }) // 超时设置 // this.download('cms/data/createSpecificationOutputHttp', { // ...this.info // }, `物料规格书(${this.info.materialCode})_${new Date().getTime()}.docx`, { timeout: 60000 }) // 超时设置 this.info.mylist = this.info.mylistshow this.info.electricallist = this.info.electricallistshow }。参照以上代码实现帮我实现生产规格书word导出
11-28
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值