关于jasperreports 提示 java.lang.ExceptionInInitializerError

前言

公司老项目需要添加关于jasperreports打印功能,刚好有一个maven项目有类似的功能,所以做了下代码迁移。本人项目相关环境 JavaWeb项目+struts2,在这其中遇到的一些问题做下汇总。希望对大家有所帮助。

 

总结

异常1.java.lang.NoSuchMethodError问题

一般这样的都是缺少相关的jar,这里也给出本人使用的相关的jar。

commons-collections-3.2.1.jar

commons-digester.jar

commons-beanutils.jar

commons-lang-2.0.jar

commons-lang3-3.4.jar

commons-logging-1.0.4.jar

jackson-core-2.3.2.jar

jackson-databind-2.3.2.jar

commons-io-2.5.jar

jackson-core-2.3.2.jar

jackson-databind-2.3.2.jar

-- 生成PDF相关

itext-asian-5.2.0.jar

itextpdf-5.5.0.jar

itext-pdfa-5.5.7.jar

-- reports相关

jasperreports-6.0.0.jar

groovy-all-2.0.1.jar

 

如何找不到相关的jar,建议去https://mvnrepository.com/ 这里面。下面给出示例。

 

 

 

 

异常2. java.lang.ExceptionInInitializerError问题

Tomcat启动第一次尝试报java.lang.ExceptionInInitializerError .....

第二次尝试报错无法初始化类net.sf.jasperreports.engine.util.JRStyledTextParser

方案1:这是无头模式问题,需要将java.awt.headless属性设置为true

static { System.setProperty("java.awt.headless", "true"); }

通过将tomcat启动命令中的无头属性设置为 -Djava.awt.headless=true。

方案2:Tomcat目录中没有temp文件夹,由于Font.java中,会创建临时文件:

Files.createTempFile("+~JF", ".tmp").toFile();

这里手动创建一个就OK了

 

这里给出其他问题的解决方式,供大家参考!

https://xbuba.com/questions/4998762

 

相关代码:

package com.toshiba.tce.popup.vo;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.util.Collection;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContextException;

import net.sf.jasperreports.engine.JRAbstractExporter;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.base.JRBaseReport;
import net.sf.jasperreports.engine.data.JRBeanArrayDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.export.JExcelApiExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRRtfExporter;
import net.sf.jasperreports.engine.export.JRXmlExporter;
import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
import net.sf.jasperreports.export.SimpleXlsxReportConfiguration;
import net.sf.jasperreports.j2ee.servlets.ImageServlet;

/**
 * jasperreports 工具类
 *
 */
public class JasperHelper {
	private static Logger logger = Logger.getLogger(JasperHelper.class);
	public static final String PRINT_TYPE = "print";
	public static final String PDF_TYPE = "pdf";
	public static final String EXCEL_TYPE = "excel";
	public static final String HTML_TYPE = "html";
	public static final String WORD_TYPE = "word";

	public static void prepareReport(JasperReport jasperReport, String type) {
		logger.debug("The method======= prepareReport() start.......................");
		/*
		 * 如果导出的是excel,则需要去掉周围的margin
		 */
		if ("excel".equals(type))
			try {
				Field margin = JRBaseReport.class.getDeclaredField("leftMargin");
				margin.setAccessible(true);
				margin.setInt(jasperReport, 0);
				margin = JRBaseReport.class.getDeclaredField("topMargin");
				margin.setAccessible(true);
				margin.setInt(jasperReport, 0);
				margin = JRBaseReport.class.getDeclaredField("bottomMargin");
				margin.setAccessible(true);
				margin.setInt(jasperReport, 0);
				Field pageHeight = JRBaseReport.class.getDeclaredField("pageHeight");
				pageHeight.setAccessible(true);
				pageHeight.setInt(jasperReport, 2147483647);
			} catch (Exception exception) {
			}
	}

	/**
	 * 导出excel
	 */
	public static void exportExcel(JasperPrint jasperPrint, String defaultFilename, HttpServletRequest request,
			HttpServletResponse response) throws IOException, JRException {
		/*
		 * 设置头信息
		 */
		response.setContentType("application/vnd.ms-excel");
		String defaultname = null;
		if (defaultFilename.trim() != null && defaultFilename != null) {
			defaultname = defaultFilename + ".xls";
		} else {
			defaultname = "export.xls";
		}

		String fileName = HttpUtil.encodeFilename(defaultname, request);
		response.setHeader("Content-Disposition",
				"attachment; filename=\"" + fileName + "\"");

		ServletOutputStream ouputStream = response.getOutputStream();
		JRXlsxExporter exporter = new JRXlsxExporter();
		
		exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(ouputStream));
		
		exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
		
		SimpleXlsxReportConfiguration configuration = new SimpleXlsxReportConfiguration();
		configuration.setRemoveEmptySpaceBetweenRows(Boolean.TRUE);
		configuration.setOnePagePerSheet(Boolean.TRUE);
		configuration.setWhitePageBackground(Boolean.FALSE);
		
		exporter.setConfiguration(configuration);
		
		exporter.exportReport();
		ouputStream.flush();
		ouputStream.close();
	}
	
	/**
	 * 导出excel
	 */
	public static void exportExcel(JasperPrint jasperPrint,String filename) throws IOException, JRException {

		OutputStream outputStream = FileUtils.openOutputStream(new File(filename));
		
		JRXlsxExporter exporter = new JRXlsxExporter();
		
		exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(outputStream));
		
		exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
		
		SimpleXlsxReportConfiguration configuration = new SimpleXlsxReportConfiguration();
		configuration.setRemoveEmptySpaceBetweenRows(Boolean.TRUE);
		configuration.setOnePagePerSheet(Boolean.TRUE);
		configuration.setWhitePageBackground(Boolean.FALSE);
		
		exporter.setConfiguration(configuration);

//		exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
//
//		exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);

//		exporter.setParameter(JRXlsxExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); // 删除记录最下面的空行
//
//		exporter.setParameter(JRXlsxExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);// 删除多余的ColumnHeader
//		//
//		exporter.setParameter(JRXlsxExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);// 显示边框
		
		
		exporter.exportReport();
		outputStream.flush();
		outputStream.close();
	}

	public static enum DocType {
		PDF, HTML, XLS, XML, RTF
	}

	public static JRAbstractExporter getJRExporter(DocType docType) {
		JRAbstractExporter exporter = null;
		switch (docType) {
		case PDF:
			exporter = new JRPdfExporter();
			break;
		case HTML:
			exporter = new JRHtmlExporter();
			break;
		case XLS:
			exporter = new JExcelApiExporter();
			break;
		case XML:
			exporter = new JRXmlExporter();
			break;
		case RTF:
			exporter = new JRRtfExporter();
			break;
		}
		return exporter;
	}

	

	/**
	 * 导出html
	 */
	private static void exportHtml(JasperPrint jasperPrint, String defaultFilename, HttpServletRequest request,
			HttpServletResponse response) throws IOException, JRException {
		response.setContentType("text/html");
		ServletOutputStream ouputStream = response.getOutputStream();
		JRHtmlExporter exporter = new JRHtmlExporter();
		exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
		exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
		exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
		exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);

		exporter.exportReport();

		ouputStream.flush();
		ouputStream.close();
	}
	
	/**
	 * 导出html
	 */
	private static void exportHtml(JasperPrint jasperPrint, String filename) throws IOException, JRException {
		OutputStream outputStream = FileUtils.openOutputStream(new File(filename));
		
		JRHtmlExporter exporter = new JRHtmlExporter();
		exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
		exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
		exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
		exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);

		exporter.exportReport();

		outputStream.flush();
		outputStream.close();
	}
	
	/**
	 * 导出pdf,注意此处中文问题,
	 * 
	 * 这里应该详细说:主要在ireport里变下就行了。看图
	 * 
	 * 1)在ireport的classpath中加入iTextAsian.jar 2)在ireport画jrxml时,看ireport最左边有个属性栏。
	 * 
	 * 下边的设置就在点字段的属性后出现。 pdf font name :STSong-Light ,pdf encoding :UniGB-UCS2-H
	 */
	private static void exportPdf(JasperPrint jasperPrint, String defaultFilename, HttpServletRequest request,
			HttpServletResponse response) throws IOException, JRException {
		response.setContentType("application/pdf");
		String defaultname = null;
		if (defaultFilename.trim() != null && defaultFilename != null) {
			defaultname = defaultFilename + ".pdf";
		} else {
			defaultname = "export.pdf";
		}
//		String fileName = new String(defaultname.getBytes("GBK"), "ISO8859_1");
		String fileName = HttpUtil.encodeFilename(defaultname, request);
		response.setHeader("Content-disposition", "attachment; filename=" + fileName);
		ServletOutputStream ouputStream = response.getOutputStream();
		JasperExportManager.exportReportToPdfStream(jasperPrint, ouputStream);
		ouputStream.flush();
		ouputStream.close();
	}
	
	/**
	 * 导出pdf,注意此处中文问题,
	 * 
	 * 这里应该详细说:主要在ireport里变下就行了。看图
	 * 
	 * 1)在ireport的classpath中加入iTextAsian.jar 2)在ireport画jrxml时,看ireport最左边有个属性栏。
	 * 
	 * 下边的设置就在点字段的属性后出现。 pdf font name :STSong-Light ,pdf encoding :UniGB-UCS2-H
	 */
	private static void exportPdf(JasperPrint jasperPrint, String fileName) throws IOException, JRException {
		JasperExportManager.exportReportToPdfFile(jasperPrint, fileName);
	}

	/**
	 * 导出word
	 */
	private static void exportWord(JasperPrint jasperPrint, String defaultFilename, HttpServletRequest request,
			HttpServletResponse response) throws JRException, IOException {
		response.setContentType("application/msword;charset=utf-8");
		String defaultname = null;
		if (defaultFilename.trim() != null && defaultFilename != null) {
			defaultname = defaultFilename + ".doc";
		} else {
			defaultname = "export.doc";
		}
//		String fileName = new String(defaultname.getBytes("GBK"), "utf-8");
		String fileName = HttpUtil.encodeFilename(defaultname, request);
		response.setHeader("Content-disposition", "attachment; filename=" + fileName);
		
		ServletOutputStream outputStream = response.getOutputStream();
		JRExporter exporter = new JRRtfExporter();
		exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
		exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);

		exporter.exportReport();
		
		outputStream.flush();
		outputStream.close();
	}
	
	/**
	 * 导出word
	 */
	private static void exportWord(JasperPrint jasperPrint, String filename) throws JRException, IOException {
		OutputStream outputStream = FileUtils.openOutputStream(new File(filename));
		
		JRExporter exporter = new JRRtfExporter();
		exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
		exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);

		exporter.exportReport();
		
		outputStream.flush();
		outputStream.close();
	}

	/**
	 * 按照类型导出不同格式文件
	 * 
	 * @param datas
	 *            数据
	 * @param type
	 *            文件类型
	 * @param is
	 *            jasper文件的来源
	 * @param request
	 * @param response
	 * @param defaultFilename默认的导出文件的名称
	 */
	public static void export(String type, String defaultFilename, File is, HttpServletRequest request,
			HttpServletResponse response, Map parameters, Connection conn) {
		try {
			JasperReport jasperReport = (JasperReport) JRLoader.loadObject(is);
			prepareReport(jasperReport, type);

			JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);

			if (EXCEL_TYPE.equals(type)) {
				exportExcel(jasperPrint, defaultFilename, request, response);
			} else if (PDF_TYPE.equals(type)) {
				exportPdf(jasperPrint, defaultFilename, request, response);
			} else if (HTML_TYPE.equals(type)) {
				exportHtml(jasperPrint, defaultFilename, request, response);
			} else if (WORD_TYPE.equals(type)) {
				exportWord(jasperPrint, defaultFilename, request, response);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	

	public static void export(String type, String defaultFilename, File is, HttpServletRequest request,
			HttpServletResponse response, Map parameters, JRDataSource conn) {
		try {
			JasperReport jasperReport = (JasperReport) JRLoader.loadObject(is);
			prepareReport(jasperReport, type);

			JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);

			if (EXCEL_TYPE.equals(type)) {
				exportExcel(jasperPrint, defaultFilename, request, response);
			} else if (PDF_TYPE.equals(type)) {
				exportPdf(jasperPrint, defaultFilename, request, response);
			} else if (HTML_TYPE.equals(type)) {
				exportHtml(jasperPrint, defaultFilename, request, response);
			} else if (WORD_TYPE.equals(type)) {
				exportWord(jasperPrint, defaultFilename, request, response);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 下载
	 * @param type
	 * @param defaultFilename
	 * @param is
	 * @param request
	 * @param response
	 * @param parameters
	 * @param reportDataValue
	 */
	public static void export(String type, String defaultFilename, String url, HttpServletRequest request,
			HttpServletResponse response, Map parameters, Object reportDataValue) {

		try {
			JasperReport jasperReport = loadReport(url);
			prepareReport(jasperReport, type);

			JasperPrint jasperPrint = null;
			
			if (reportDataValue instanceof DataSource) {
				DataSource jdbcDataSourceToUse = (DataSource) reportDataValue;
				Connection conn = jdbcDataSourceToUse.getConnection();
				jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);
			}
			else {
				JRDataSource jrDataSource = convertReportData(reportDataValue);
				jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, jrDataSource);
			}

			if (EXCEL_TYPE.equals(type)) {
				exportExcel(jasperPrint, defaultFilename, request, response);
			} else if (PDF_TYPE.equals(type)) {
				exportPdf(jasperPrint, defaultFilename, request, response);
			} else if (HTML_TYPE.equals(type)) {
				exportHtml(jasperPrint, defaultFilename, request, response);
			} else if (WORD_TYPE.equals(type)) {
				exportWord(jasperPrint, defaultFilename, request, response);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	/**
	 * 导出到文件
	 * @param type
	 * @param filename
	 * @param url
	 * @param parameters
	 * @param reportDataValue
	 */
	public static void export(String type, String filename, String url, Map parameters, Object reportDataValue) {

		try {
			JasperReport jasperReport = loadReport(url);
			prepareReport(jasperReport, type);

			JasperPrint jasperPrint = null;
			
			if (reportDataValue instanceof DataSource) {
				DataSource jdbcDataSourceToUse = (DataSource) reportDataValue;
				Connection conn = jdbcDataSourceToUse.getConnection();
				jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);
			}
			else {
				JRDataSource jrDataSource = convertReportData(reportDataValue);
				jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, jrDataSource);
			}

			if (EXCEL_TYPE.equals(type)) {
				exportExcel(jasperPrint, filename);
			} else if (PDF_TYPE.equals(type)) {
				exportPdf(jasperPrint, filename);
			} else if (HTML_TYPE.equals(type)) {
				exportHtml(jasperPrint, filename);
			} else if (WORD_TYPE.equals(type)) {
				exportWord(jasperPrint, filename);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	/**
	 * 显示
	 * @param type
	 * @param defaultFilename
	 * @param is
	 * @param request
	 * @param response
	 * @param parameters
	 * @param reportDataValue
	 */
	public static void show(String type, String defaultFilename, String url, HttpServletRequest request,
			HttpServletResponse response, Map parameters, Object reportDataValue) {

		try {
			JasperReport jasperReport = loadReport(url);
			prepareReport(jasperReport, type);

			JasperPrint jasperPrint = null;
			
			if (reportDataValue instanceof DataSource) {
				DataSource jdbcDataSourceToUse = (DataSource) reportDataValue;
				Connection conn = jdbcDataSourceToUse.getConnection();
				jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);
			}
			else {
				JRDataSource jrDataSource = convertReportData(reportDataValue);
				jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, jrDataSource);
			}

			if (EXCEL_TYPE.equals(type)) {
				exportExcel(jasperPrint, defaultFilename, request, response);
			} else if (PDF_TYPE.equals(type)) {
				showPdf(jasperPrint, defaultFilename, request, response);
			} else if (HTML_TYPE.equals(type)) {
				showHtml(jasperPrint, defaultFilename, request, response);
			} else if (WORD_TYPE.equals(type)) {
				exportWord(jasperPrint, defaultFilename, request, response);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	public static JRDataSource convertReportData(Object value) throws IllegalArgumentException {
		if (value instanceof JRDataSource) {
			return (JRDataSource) value;
		}
		else if (value instanceof Collection) {
			return new JRBeanCollectionDataSource((Collection) value);
		}
		else if (value instanceof Object[]) {
			return new JRBeanArrayDataSource((Object[]) value);
		}
		else {
			throw new IllegalArgumentException("Value [" + value + "] cannot be converted to a JRDataSource");
		}
	}

	/**
	 * Loads a {@code JasperReport} from the specified {@code Resource}.
	 * If the {@code Resource} points to an uncompiled report design file then
	 * the report file is compiled dynamically and loaded into memory.
	 * @param resource the {@code Resource} containing the report definition or design
	 * @return a {@code JasperReport} instance
	 */
	protected static final JasperReport loadReport(String filename) {
		try {
			if (filename != null) {
				if (filename.endsWith(".jasper")) {
					// Load pre-compiled report.
					if (logger.isInfoEnabled()) {
						logger.info("Loading pre-compiled Jasper Report from " + filename);
					}
					InputStream is = FileUtils.openInputStream(new File(filename));
					try {
						return (JasperReport) JRLoader.loadObject(is);
					}
					finally {
						is.close();
					}
				}
				else if (filename.endsWith(".jrxml")) {
					// Compile report on-the-fly.
					if (logger.isInfoEnabled()) {
						logger.info("Compiling Jasper Report loaded from " + filename);
					}
					InputStream is = FileUtils.openInputStream(new File(filename));
					try {
						JasperDesign design = JRXmlLoader.load(is);
						return JasperCompileManager.compileReport(design);
					}
					finally {
						is.close();
					}
				}
			}
			throw new IllegalArgumentException(
					"Report filename [" + filename + "] must end in either .jasper or .jrxml");
		}
		catch (IOException ex) {
			throw new ApplicationContextException(
					"Could not load JasperReports report from " + filename, ex);
		}
		catch (JRException ex) {
			throw new ApplicationContextException(
					"Could not parse JasperReports report from " + filename, ex);
		}
	}

	/**
	 * 输出html静态页面,必须注入request和response
	 * 
	 * @param jasperPath
	 * @param params
	 * @param sourceList
	 * @param imageUrl
	 *            报表文件使用的图片路径,比如 ../servlets/image?image=
	 * @throws JRException
	 * @throws IOException
	 * @throws ServletException
	 */
	public static void showHtml(JasperPrint jasperPrint,String defaultFilename, HttpServletRequest request,
			HttpServletResponse response) throws JRException, IOException {

		request.setCharacterEncoding("utf-8");
		//response.setCharacterEncoding("utf-8");
		response.setContentType("text/html");

		JRAbstractExporter exporter = getJRExporter(DocType.HTML);

		request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);

		PrintWriter out = response.getWriter();

		exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
		exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);
		exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
		exporter.exportReport();
		out.flush();

	}
	
	public static void showPdf(JasperPrint jasperPrint,String defaultFilename, HttpServletRequest request,
			HttpServletResponse response) throws JRException, IOException {

		request.setCharacterEncoding("utf-8");
		//response.setCharacterEncoding("utf-8");
		response.setContentType("text/html");
		response.setContentType("application/pdf");

		JRAbstractExporter exporter = getJRExporter(DocType.PDF);

		request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);

		PrintWriter out = response.getWriter();

		exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
		exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);
		exporter.exportReport();
		out.flush();

	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值