精华内容
下载资源
问答
  • JAVA生成报表(JFreeChart)

    千次阅读 2016-09-07 11:10:56
    JAVA生成报表 JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)...

    JAVA生成报表

    JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、甘特图(Gantt charts)等等多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。 ——–百度百科

    效果图

    这里写图片描述

    项目结构图

    这里写图片描述

    如果没有下载JFreeChart的 请点击—–> JFreeChart下载

    web.xml配置参数

     <servlet>
            <servlet-name>DisplayChart</servlet-name>
            <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>DisplayChart</servlet-name>
            <url-pattern>/DisplayChart</url-pattern>
        </servlet-mapping>
    1. 生成柱状图
    
    import javax.servlet.http.HttpSession;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.servlet.ServletUtilities;
    import org.jfree.data.category.DefaultCategoryDataset;
    
    /**
     * 柱状图 bar 
     * 
     * @author Administrator
     * 
     */
    public class BarChart1 {
        public static String getBarChart(HttpSession session) throws Exception {
            DefaultCategoryDataset dataset = new DefaultCategoryDataset();
            dataset.addValue(510, "江西", "香蕉");
            dataset.addValue(320, "江西", "苹果");
            dataset.addValue(580, "江西", "橘子");
            dataset.addValue(400, "江西", "梨子");
            JFreeChart chart = ChartFactory.createBarChart3D("水果销售统计图", "水果", "销售",
                    dataset, PlotOrientation.VERTICAL, true, true, true);
            String fileName = ServletUtilities.saveChartAsPNG(chart, 700, 500,
                    null, session);
            return fileName;
        }
    }
    

    JSP中调用方法(测试Demo就没有和Struts2整合)

    <%
    //柱状图 S
        String fileName=BarChart1.getBarChart(session);//垂直
    %>
    <h1>柱状图</h1>
    <img src="DisplayChart?filename=<%=fileName %>" width="700" height="500" border="0"/>

    2.生成饼状图

    
    import java.awt.Font;
    import java.text.NumberFormat;
    
    import javax.servlet.http.HttpSession;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
    import org.jfree.chart.plot.PiePlot;
    import org.jfree.chart.plot.PiePlot3D;
    import org.jfree.chart.servlet.ServletUtilities;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.data.general.DefaultPieDataset;
    import org.jfree.util.Rotation;
    
    public class PieChart3 {
    
        public static String getPieChart3(HttpSession session) throws Exception {
            DefaultPieDataset dataset = new DefaultPieDataset();
            dataset.setValue("QQ", 1000);
            dataset.setValue("微信", 1200);
            dataset.setValue("陌陌", 400);
            dataset.setValue("飞信", 100);
            dataset.setValue("其他", 29);
    
            JFreeChart chart = ChartFactory.createPieChart3D("社交软件下载量统计图", dataset,
                    true, true, true);
    
            // 副标题
            chart.addSubtitle(new TextTitle("2016年度(单位/万)"));
    
            PiePlot pieplot = (PiePlot) chart.getPlot();
            pieplot.setLabelFont(new Font("宋体", 0, 11));
            // 设置饼图是圆的(true),还是椭圆的(false);默认为true
            pieplot.setCircular(true);
            // 没有数据的时候显示的内容
            pieplot.setNoDataMessage("无数据显示");
            StandardPieSectionLabelGenerator standarPieIG = new StandardPieSectionLabelGenerator(
                    "{0}:({1}.{2})", NumberFormat.getNumberInstance(),
                    NumberFormat.getPercentInstance());
            pieplot.setLabelGenerator(standarPieIG);
            // 3D设置
            PiePlot3D pieplot3d = (PiePlot3D) chart.getPlot();
    
            // 设置开始角度
            pieplot3d.setStartAngle(120D);
            // 设置方向为”顺时针方向“
            pieplot3d.setDirection(Rotation.CLOCKWISE);
            // 设置透明度,0.5F为半透明,1为不透明,0为全透明
            pieplot3d.setForegroundAlpha(0.7F);
            String fileName = ServletUtilities.saveChartAsPNG(chart, 700, 500,
                    null, session);
    
            return fileName;
        }
    }
    

    3.生成折线图

    import java.awt.Font;
    
    import javax.servlet.http.HttpSession;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.DateAxis;
    import org.jfree.chart.axis.DateTickUnit;
    import org.jfree.chart.labels.ItemLabelAnchor;
    import org.jfree.chart.labels.ItemLabelPosition;
    import org.jfree.chart.labels.StandardXYItemLabelGenerator;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.XYItemRenderer;
    import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
    import org.jfree.chart.servlet.ServletUtilities;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.data.time.Month;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    import org.jfree.ui.TextAnchor;
    
    public class LineChart2 {
    
        public static String getLineChart2(HttpSession session) throws Exception {
            // 访问量统计
            TimeSeries timeSeries = new TimeSeries("A网站访问量统计", Month.class);
            // 添加数据
            timeSeries.add(new Month(1, 2013), 100);
            timeSeries.add(new Month(2, 2013), 200);
            timeSeries.add(new Month(3, 2013), 300);
            timeSeries.add(new Month(4, 2013), 400);
            timeSeries.add(new Month(5, 2013), 560);
            timeSeries.add(new Month(6, 2013), 600);
            timeSeries.add(new Month(7, 2013), 750);
            timeSeries.add(new Month(8, 2013), 890);
            timeSeries.add(new Month(9, 2013), 120);
            timeSeries.add(new Month(10, 2013), 400);
            timeSeries.add(new Month(11, 2013), 1200);
            timeSeries.add(new Month(12, 2013), 1600);
    
            // 访问量统计
            TimeSeries timeSeries2 = new TimeSeries("B网站访问量统计", Month.class);
            // 添加数据
            timeSeries2.add(new Month(1, 2013), 50);
            timeSeries2.add(new Month(2, 2013), 100);
            timeSeries2.add(new Month(3, 2013), 150);
            timeSeries2.add(new Month(4, 2013), 200);
            timeSeries2.add(new Month(5, 2013), 220);
            timeSeries2.add(new Month(6, 2013), 300);
            timeSeries2.add(new Month(7, 2013), 340);
            timeSeries2.add(new Month(8, 2013), 400);
            timeSeries2.add(new Month(9, 2013), 450);
            timeSeries2.add(new Month(10, 2013), 500);
            timeSeries2.add(new Month(11, 2013), 70);
            timeSeries2.add(new Month(12, 2013), 800);
    
            // 定义时间序列的集合
            TimeSeriesCollection lineDataset = new TimeSeriesCollection();
            lineDataset.addSeries(timeSeries);
            lineDataset.addSeries(timeSeries2);
    
            JFreeChart chart = ChartFactory.createTimeSeriesChart("访问量统计时间折线图",
                    "月份", "访问量", lineDataset, true, true, true);
    
            // 设置主标题
            chart.setTitle(new TextTitle("A,B网站访问量统计对比图", new Font("隶书",
                    Font.ITALIC, 15)));
            // 设置子标题
            TextTitle subtitle = new TextTitle("2013年度", new Font("黑体", Font.BOLD,
                    12));
            chart.addSubtitle(subtitle);
            chart.setAntiAlias(true);
    
            // 设置时间轴的范围。
            XYPlot plot = (XYPlot) chart.getPlot();
            DateAxis dateaxis = (DateAxis) plot.getDomainAxis();
            dateaxis.setDateFormatOverride(new java.text.SimpleDateFormat("M月"));
            dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.MONTH, 1));
    
            // 设置曲线是否显示数据点
            XYLineAndShapeRenderer xylinerenderer = (XYLineAndShapeRenderer) plot
                    .getRenderer();
            xylinerenderer.setBaseShapesVisible(true);
    
            // 设置曲线显示各数据点的值
            XYItemRenderer xyitem = plot.getRenderer();
            xyitem.setBaseItemLabelsVisible(true);
            xyitem.setBasePositiveItemLabelPosition(new ItemLabelPosition(
                    ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_CENTER));
            xyitem.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
            xyitem.setBaseItemLabelFont(new Font("Dialog", 1, 12));
            plot.setRenderer(xyitem);
    
            String fileName = ServletUtilities.saveChartAsPNG(chart, 700, 500,
                    session);
    
            return fileName;
        }
    }
    

    我的项目源码下载—->JAVA生成报表

    与Struts2的整合

    项目结构图

    这里写图片描述

    - 配置struts2的环境 (导入相关jar包)与JF整合

    web.xml参数配置

    <filter>
           <filter-name>StrutsPrepareAndExecuteFilter</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
      </filter>
     <filter-mapping>
              <filter-name>StrutsPrepareAndExecuteFilter</filter-name>
              <url-pattern>/*</url-pattern>
      </filter-mapping>

    BarCharAction

    
    import java.awt.Color;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.labels.ItemLabelAnchor;
    import org.jfree.chart.labels.ItemLabelPosition;
    import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
    import org.jfree.chart.plot.CategoryPlot;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.renderer.category.BarRenderer3D;
    import org.jfree.data.category.CategoryDataset;
    import org.jfree.data.general.DatasetUtilities;
    import org.jfree.ui.TextAnchor;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class BarCharAction extends ActionSupport {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        private JFreeChart chart;
    
        public JFreeChart getChart() {
            return chart;
        }
    
        @Override
        public String execute() throws Exception {
            double[][] data = new double[][] { { 1320, 1110, 1123, 321 },
                    { 720, 210, 1423, 1321 }, { 830, 1310, 123, 521 },
                    { 400, 1110, 623, 321 } };
            String[] rowKeys = { "苹果", "香蕉", "橘子", "梨子" };
            String[] columnKeys = { "深圳", "北京", "上海", "南京" };
            CategoryDataset dataset = DatasetUtilities.createCategoryDataset(
                    rowKeys, columnKeys, data);
            chart = ChartFactory.createBarChart3D("水果销售统计图", "水果", "销售", dataset,
                    PlotOrientation.VERTICAL, true, true, true);
    
            CategoryPlot plot = chart.getCategoryPlot();
            // 设置网格背景颜色
            plot.setBackgroundPaint(Color.white);
            // 设置网格竖线颜色
            plot.setDomainGridlinePaint(Color.pink);
            // 设置网格横线颜色
            plot.setRangeGridlinePaint(Color.pink);
    
            // 显示每个柱的数值,并修改该数值的字体属性
            BarRenderer3D renderer = new BarRenderer3D();
            renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
            renderer.setBaseItemLabelsVisible(true);
    
            renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(
                    ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
            renderer.setItemLabelAnchorOffset(10D);
    
            // 设置平行柱的之间距离
            renderer.setItemMargin(0.4);
    
            plot.setRenderer(renderer);
    
            return SUCCESS;
        }
    
    }
    

    struts.xml参数配置

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
    
        <package name="jfreechart" extends="jfreechart-default">
            <action name="barChart" class="com.mist.chart.bar.BarCharAction">
                <result name="success" type="chart">
                   <param name="value">chart</param>
                   <param name="type">png</param>
                   <param name="width">700</param>
                   <param name="height">500</param>
                 </result>
            </action>
        </package>
    
    </struts>

    整合好之后调用就比上面没整合的方便多了

     <body>
        <img alt="" src="barChart">
      </body>

    效果图,还是和之前的一样

    这里写图片描述

    JAVA生成报表就写到这里了

    展开全文
  • 如果能够将每天的感情生活量化,且以时间为X轴,生成数据报表,就可以为她的决策提供数据支持。秉着以领导意志为导向的基本原则,开发了本软件,为家庭信息化建设提供新的思路。 二、系统概述 本系统的基本功能是...
  • java操作百万级EXECL2007-poi本次记录java操作poi代码片 本次记录java操作poi 步骤分析 (1)设置POI的事件模式 根据Excel获取文件流 根据文件流创建OPCPackage 创建XSSFReader对象 (2)Sax解析 自定义Sheet处理器 ...

    java操作百万级EXECL2007-poi

    本次记录java操作poi

    步骤分析
    (1)设置POI的事件模式
    根据Excel获取文件流
    根据文件流创建OPCPackage
    创建XSSFReader对象
    (2)Sax解析
    自定义Sheet处理器
    创建Sax的XmlReader对象
    设置Sheet的事件处理器
    逐行读取

    代码片

    实体

    public class PoiEntity {
        private String id;
        private String breast;
        private String adipocytes;
        private String negative;
        private String staining;
        private String supportive;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getBreast() {
            return breast;
        }
    
        public void setBreast(String breast) {
            this.breast = breast;
        }
    
        public String getAdipocytes() {
            return adipocytes;
        }
    
        public void setAdipocytes(String adipocytes) {
            this.adipocytes = adipocytes;
        }
    
        public String getNegative() {
            return negative;
        }
    
        public void setNegative(String negative) {
            this.negative = negative;
        }
    
        public String getStaining() {
            return staining;
        }
    
        public void setStaining(String staining) {
            this.staining = staining;
        }
    
        public String getSupportive() {
            return supportive;
        }
    
        public void setSupportive(String supportive) {
            this.supportive = supportive;
        }
    
        @Override
        public String toString() {
            return "PoiEntity{" +
                    "id='" + id + '\'' +
                    ", breast='" + breast + '\'' +
                    ", adipocytes='" + adipocytes + '\'' +
                    ", negative='" + negative + '\'' +
                    ", staining='" + staining + '\'' +
                    ", supportive='" + supportive + '\'' +
                    '}';
        }
    }
    
     自定义处理器
    //自定义Sheet基于Sax的解析处理器
    public class SheetHandler implements XSSFSheetXMLHandler.SheetContentsHandler {
        //封装实体对象
        private PoiEntity entity;
        /**
         * 解析行开始
         */
        @Override
        public void startRow(int rowNum) {
            if (rowNum >0 ) {
                entity = new PoiEntity();
           }
       }
         * 解析每一个单元格
         * 参数说明:cellReference:单元格名称,
         * formattedValue:单元的值
         * comment:批注
         */
        @Override
        public void cell(String cellReference, String formattedValue, XSSFComment comment) 
    {
            if(entity != null) {
                switch (cellReference.substring(0, 1)) {
                    case "A":
                        entity.setId(formattedValue);
                        break;
                    case "B":
                        entity.setBreast(formattedValue);
                        break;
                    case "C":
                        entity.setAdipocytes(formattedValue);
                        break;
                    case "D":
                        entity.setNegative(formattedValue);
                        break;
                    case "E":
                        entity.setStaining(formattedValue);
                        break;
                    case "F":
                        entity.setSupportive(formattedValue);
                        break;
                    default:
                        break;
               }
           }
       }
        /**
         * 解析行结束
         */
        public void endRow(int rowNum) {
            System.out.println(entity);
       }
        //处理头尾
        public void headerFooter(String text, boolean isHeader, String tagName) {
       }
    }
        /**
    

    解析器

    /**
    * 自定义Excel解析器
    */
    public class ExcelParser {
        public void parse (String path) throws Exception {
            //1.根据Excel获取OPCPackage对象
             OPCPackage pkg = OPCPackage.open(文件路径, PackageAccess.READ);
            try {
                //2.创建XSSFReader对象
                XSSFReader reader = new XSSFReader(pkg);
                //3.获取SharedStringsTable对象
                SharedStringsTable sst = reader.getSharedStringsTable();
                //4.获取StylesTable对象
                StylesTable styles = reader.getStylesTable();
                //5.创建Sax的XmlReader对象
                XMLReader parser = XMLReaderFactory.createXMLReader();
                //6.设置处理器
                parser.setContentHandler(new XSSFSheetXMLHandler(styles,sst, new
    SheetHandler(), false));
                XSSFReader.SheetIterator sheets = (XSSFReader.SheetIterator) 
    reader.getSheetsData();
                //7.逐行读取
                while (sheets.hasNext()) {
                    InputStream sheetstream = sheets.next();
                    InputSource sheetSource = new InputSource(sheetstream);
                    try {
                        parser.parse(sheetSource);
                   } finally {
                        sheetstream.close();
                   }
               }
           } finally {
                pkg.close();
           }
       }
    }
    
    展开全文
  • java爬虫实战(2):下载沪深信息科技类上市公司年度报告*本实战仅作为学习和技术交流使用,转载请注明出处;本篇实战来源于一位朋友需要进行学术研究,涉及数据内容是2010年-2016年的沪深主板上市信息科技类公司...

    java爬虫实战(2):下载沪深信息科技类上市公司年度报告

    *本实战仅作为学习和技术交流使用,转载请注明出处;


    本篇实战来源于一位朋友需要进行学术研究,涉及数据内容是2010年-2016年的沪深主板上市信息科技类公司年报,由于并没有现成的数据源,百度之后发现“巨潮咨询网(http://www.cninfo.com.cn/)”中含有所需信息,但需要自己手动下载,工程量大。因此,程序作为提高效率的工具,它的价值就在此。


    HttpURLConnection

    Java网络编程中经常使用的网络连接类库无疑是HttpClient和HttpURLConnection, 其种HttpURLConnection能实现的,HttpClient都能实现,简单说来HttpCilent是近似于HttpURLConnection的封装。具体二者的区别将另外用一篇博文进行讲解。鉴于本次数据下载只有提交请求及获取Response数据,因此用HttpURLConnection足够。

    首先分析目标网站请求响应情况
    目标网站搜索页面
    该搜索页面已经提供了详细的搜索条件,选择相应的条目,选择搜索之后,页面通过JQuery的AJAX进行请求封装,而每次页面仅显示30条记录,选择下页将再次触发AJAX请求,进行页面的异步刷新。同时,利用浏览器的调试器中Network可以发现,每次页面请求为POST请求,返回的则是一个JSON对象;JSON对象中包含了下载文件链接的必要参数。到此可知本次下载主要分两个过程:
    1.通过POST方式获取到查询结果的所有JSON对象;
    2.提取JSON对象中的相应参数,构造下载URL字段;
    3.通过GET方式下载文件;

    通过POST方式获取JSON

    查看网页请求中的post参数,主要有category,trade,pagenum, pageSize,showTitle,seDate等,因此可以根据参数构造post请求。在HttpURLConnection中post请求实质是一个字符串,因此可以按照如下构造请求Content:

     String content = "stock=&searchkey=&plate=&category=category_ndbg_szsh;&trade="+URLEncoder.encode("信息传输、软件和信息技术服务业;", "utf-8")+"&column=szse&columnTitle="+URLEncoder.encode("历史公告查询","utf-8")+"&pageNum="+pagenum+"&pageSize=30&tabName=fulltext&sortName=code&sortType=asc&limit=&showTitle="+URLEncoder.encode("信息传输、软件和信息技术服务业/trade/信息传输、软件和信息技术服务业;category_ndbg_szsh/category/年度报告&seDate=请选择日期","utf-8");

    此处使用了URLEncoder解决url地址中的中文编码问题,在网络编程中也是最常使用的。

    URLDecoder.decode("测试", "UTF-8");//解码
    URLEncoder.encode("测试", "UTF-8");//编码

    之后便是构造POST请求的代码

    URL url = new URL(urlStr);//利用urlStr字符串构造URL对象
    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
    conn.setConnectTimeout(50000);//设置超时
    conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36");//设置请求头部User-Agent,防止对方服务器屏蔽程序
    //设置post,HttpURLConnection的post设置
    conn.setDoInput(true);
    conn.setDoOutput(true);
    conn.setRequestMethod("POST");
    conn.setUseCaches(false);
    conn.setInstanceFollowRedirects(true);
    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    conn.setChunkedStreamingMode(5);  

    提交post请求

    conn.connect();
    DataOutputStream out = new DataOutputStream(conn.getOutputStream());//封装conn的post字节流
    //发送post请求
    out.writeUTF(content);
    out.flush();
    out.close();

    获取Response,即JSON数据流

    InputStream inputStream = conn.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));//此处利用InputStreanReader()对返回的字节流做了utf-8编码处理,正是为了完美解决中文乱码问题,利用BufferedReaeder进行流读取,也是java最常见的多写方式
    while((line=br.readLine())!=null){
        bw.append(line);//bw = new BufferedWriter(new FileWriter("file"));
    }

    通过GET请求获取文件

    假设我们用JSON-Lib(下节介绍)已经处理返回的JSON文件,并得到想要的参数构造了GET请求的url地址,此时发起HttpURLConnection的GET请求:

    URL url = new URL(urlStr);//urlStr此时为get请求url
    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
    conn.setConnectTimeout(500000);
    conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36");//同post请求
    //通过连接头部截取文件名
    String contentDisposition = new String(conn.getHeaderField("Content-Disposition").getBytes("ISO-8859-1"), "GBK");//获取中文文件名
    contentDisposition = URLDecoder.decode(contentDisposition,"utf-8");
    String filename = contentDisposition.substring(contentDisposition.indexOf('\"') + 1, contentDisposition.lastIndexOf("\""));
    //保存文件
    File saveDir = new File(savePath);
    if(!saveDir.exists())
          saveDir.mkdir();
    filename = filename.replace("*", "");
    File file = new File(saveDir+File.separator+filename); 
    FileOutputStream fos = null;
    InputStream inputStream = null;
    if(!file.exists()){
    inputStream = conn.getInputStream();
    System.out.println(filename);
    byte[] getData = readInputStream(inputStream);//此处采用ByteArrayOutputStream方式进行流的写,同样用其他流读写也可以,如BuffedWriter,同上
    fos = new FileOutputStream(file);       
    fos.write(getData);  
    //readInutStream function
    public static  byte[] readInputStream(InputStream inputStream) throws IOException {    
            byte[] buffer = new byte[1024];    
            int len = 0;    
            ByteArrayOutputStream bos = new ByteArrayOutputStream();    
            while((len = inputStream.read(buffer)) != -1) {    
                bos.write(buffer, 0, len);    
            }    
            bos.close();    
            return bos.toByteArray();    
    }    

    至此,利用HttpURLConnection已经解决了模拟POST和GET请求

    JSON-Lib

    JSON-Lib是java常用的解析json或者json文件转换的工具包,类似的工具类jar包很多,可以上Apache官网上找。使用JSON-Lib较为简单,这也是本项目的原则。
    JSON-Lib现在版本已经2.4,但引用它前,需要导入相应的jar包(如果运行出错,基本是关联jar包版本不对,建议下个旧版的)

    json-lib-2.4-jdk15.jar
    commons-beanutils-1.9.3.jar
    commons-logging-1.2.jar
    ezmorph-1.0.6.jar
    commons-lang-2.6.jar
    commons-collections-3.2.1.jar

    此处仅介绍JSON-Lib解析json字符串命令,代码如下

    public static List<String> parse(String jsonstring){
            JSONObject jb = JSONObject.fromObject(jsonstring);//通过json字符串获取到json对象
            JSONArray ja = jb.getJSONArray("announcements"); //截取json对象中的某个属性,封装成k-v数组
            String pre = "http://three.cninfo.com.cn/new/announcement/download";//目标网站下载链接的get请求前缀,最后url = pre+"?bulletinId="+id+"&announceTime="+t;
            try{
            for(int i=0;i<ja.size();i++){
                String id = ja.getJSONObject(i).getString("announcementId");//获取id 
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");//格式化时间
                String time = ja.getJSONObject(i).getString("announcementTime");
                String title = ja.getJSONObject(i).getString("announcementTitle");
                String secname = ja.getJSONObject(i).getString("secName");
                if(title.contains("摘要")||title.contains("2009"))//剔除不需要的对象
                    continue;
                long l = new Long(time);
                Date date = new Date(l);
                String t = formatter.format(date);//2017-04-02格式化
                String result = pre+"?bulletinId="+id+"&announceTime="+t;
                url.add(result);//保存构造的url,此处url为List<String>对象
            }}catch(Exception e){
                e.printStackTrace();
            }
            return url;
        }

    线程池,同步

    为了让程序充分利用cpu(虽然加重对方服务器压力),开启多线程,同时对相应的GET请求的url进行同步操作。此处采用java中的线程池完成并发。
    首先构造基础的线程类DownloadThread,实现Runnable接口

    public class DownloadThread implements Runnable{
        public List<String> url;//get请求的url
        private int index = 0; 
        public DownloadThread(List<String> l,int i){//构造函数,传入url集合,以及同步需要同步的信号量index,该index指代url list中的第i条记录
            url = l;
            index = i;
        }
        public DownloadThread(int i){//测试使用
            index = i;
        }
        @Override
        public void run() {
            synchronized(this){
                index++;//同步index,保证多线程在遍历url list时候不重复遍历
            }
            DownLoadFile.downloadFile(url.get(index),"AnnualReport//");//调用静态函数downloadFile(par1,par2)开始下载,par1为urlStr,par2为文件保存目录
            System.out.println(Thread.currentThread().getName()+":"+index);
        }
    
    }

    java提供了四种线程池的实现方式(后续会深入java线程池原理),包括

    newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
    newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
    newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行。
    newSingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行

    本实例采用newFixedThreadPool创建一个定长的线程池,线程池大小为5

    DownloadThread t = new DownloadThread(url,-1);//实例化自定义的线程类DownloadThread
    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5); //线程池打开
    for (int i=0;i < 1430; i++) { //1430为此次下载文件的总个数,意味让线程执行1430次run函数
        fixedThreadPool.execute(t); //将自定义线程交由线程池让调度和管理
    }

    本实战至此已经完成了主要的逻辑部分的介绍,下面贴出项目的所有源代码。

    源代码

    DownLoadThread.jar

    import java.util.List;
    
    public class DownloadThread implements Runnable{
        public List<String> url;
        private int index = 0; 
        public DownloadThread(List<String> l,int i){
            url = l;
            index = i;
        }
        public DownloadThread(int i){
            index = i;
        }
        @Override
        public void run() {
            synchronized(this){
                index++;
            }
            DownLoadFile.downloadFile(url.get(index),"AnnualReport//");
            System.out.println(Thread.currentThread().getName()+":"+index);
    
        }
    
    }

    DownLoadJson.java

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.ByteArrayOutputStream;
    import java.io.DataOutputStream;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
    
    
    public class DownLoadJson {
        public static int totalAnnouncement = 0;
        public static BufferedWriter bw = null;
        /* 下载 url 指向的网页 */
        public static void downloadFile(String urlStr,int pagenum) {
            try{
                URL url = new URL(urlStr);
                HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                conn.setConnectTimeout(50000);
                //防止屏蔽程序抓取而返回403错误  
                conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36");  
                conn.setDoInput(true);
                conn.setDoOutput(true);
                conn.setRequestMethod("POST");
                conn.setUseCaches(false);
                conn.setInstanceFollowRedirects(true);
                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                conn.setChunkedStreamingMode(5);
                conn.connect();
                DataOutputStream out = new DataOutputStream(conn.getOutputStream());
    
                String content = "stock=&searchkey=&plate=&category=category_ndbg_szsh;&trade="+URLEncoder.encode("信息传输、软件和信息技术服务业;", "utf-8")
                        +"&column=szse&columnTitle="+URLEncoder.encode("历史公告查询","utf-8")+"&pageNum="+pagenum+"&pageSize=30&tabName=fulltext&sortName=code&sortType=asc&limit=&showTitle="
                        +URLEncoder.encode("信息传输、软件和信息技术服务业/trade/信息传输、软件和信息技术服务业;category_ndbg_szsh/category/年度报告&seDate=请选择日期","utf-8");
    
    
                out.writeUTF(content);
                out.flush();
                out.close();
                /*Map<String,List<String>> map = conn.getHeaderFields();
                for(String s:map.keySet()){
                    for(String t:map.get(s))
                        System.out.println(s+":"+t);
                }*/
                InputStream inputStream = conn.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
    
                String line = null;
                while((line=br.readLine())!=null){
                    line = line.replace("“", "\'");
                    line = line.replace("”", "\'");
                    //line = new String(line.getBytes("GBK"),"UTF-8");
                    bw.append(URLDecoder.decode(line, "utf-8"));
                    bw.append("\n");
    
                }
                /*byte[] getData = readInputStream(inputStream);
                File saveDir = new File(savePath);
                if(!saveDir.exists())
                    saveDir.mkdir();
                File file = new File(saveDir+File.separator+"json");      
                FileOutputStream fos = new FileOutputStream(file);       
                fos.write(getData);   
                if(fos!=null){  
                    fos.close();    
                }  
                if(inputStream!=null){  
                    inputStream.close();  
                }  */
    
    
            }catch(Exception e){
                e.printStackTrace();
            }
    
        }
         public static  byte[] readInputStream(InputStream inputStream) throws IOException {    
                byte[] buffer = new byte[1024];    
                int len = 0;    
                ByteArrayOutputStream bos = new ByteArrayOutputStream();    
                while((len = inputStream.read(buffer)) != -1) {    
                    bos.write(buffer, 0, len);    
                }    
                bos.close();    
                return bos.toByteArray();    
          } 
         public static void main(String[] args){
             try{
                 totalAnnouncement = 2880;
                 bw = new BufferedWriter(new FileWriter("json//json",true));
                 for(int i=1;i<totalAnnouncement/30+2;i++){
                     downloadFile("http://www.cninfo.com.cn/cninfo-new/announcement/query",i);
                     System.out.println(i);
                 }
                 bw.flush();
                 bw.close();
             }catch(Exception e){
                 e.printStackTrace();
             }
    
         }
    
    }

    DownLoadFile.jar

    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLDecoder;
    
    
    public class DownLoadFile {
    
        /* 下载 url 指向的网页 */
        public static void downloadFile(String urlStr, String savePath) {
            try{
                URL url = new URL(urlStr);
                HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                conn.setConnectTimeout(500000);
                //防止屏蔽程序抓取而返回403错误  
                conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");  
    
             // 文件名
                String contentDisposition = new String(conn.getHeaderField("Content-Disposition").getBytes("ISO-8859-1"), "GBK");
                contentDisposition = URLDecoder.decode(contentDisposition,"utf-8");
                String filename = contentDisposition.substring(contentDisposition.indexOf('\"') + 1, contentDisposition.lastIndexOf("\""));
    
                File saveDir = new File(savePath);
                if(!saveDir.exists())
                    saveDir.mkdir();
                filename = filename.replace("*", "");
                File file = new File(saveDir+File.separator+filename); 
                FileOutputStream fos = null;
                InputStream inputStream = null;
                if(!file.exists()){
                    inputStream = conn.getInputStream();
                    System.out.println(filename);
                    byte[] getData = readInputStream(inputStream);
                    fos = new FileOutputStream(file);       
                    fos.write(getData);  
                }
    
                if(fos!=null){  
                    fos.close();    
                }  
                if(inputStream!=null){  
                    inputStream.close();  
                }  
    
    
            }catch(Exception e){
                e.printStackTrace();
            }
    
        }
         public static  byte[] readInputStream(InputStream inputStream) throws IOException {    
                byte[] buffer = new byte[1024];    
                int len = 0;    
                ByteArrayOutputStream bos = new ByteArrayOutputStream();    
                while((len = inputStream.read(buffer)) != -1) {    
                    bos.write(buffer, 0, len);    
                }    
                bos.close();    
                return bos.toByteArray();    
            }    
    }

    DownloadMain.java

    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    
    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    
    public class DownloadMain {
        public static List<String> json = new ArrayList<String>();
        public static List<String> url = new ArrayList<String>();
        public static List<String> parse(String jsonstring){
            JSONObject jb = JSONObject.fromObject(jsonstring);
            JSONArray ja = jb.getJSONArray("announcements"); 
            String pre = "http://three.cninfo.com.cn/new/announcement/download";
            try{
            for(int i=0;i<ja.size();i++){
                String id = ja.getJSONObject(i).getString("announcementId");
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
                String time = ja.getJSONObject(i).getString("announcementTime");
                String title = ja.getJSONObject(i).getString("announcementTitle");
                String secname = ja.getJSONObject(i).getString("secName");
                if(title.contains("摘要")||title.contains("2009"))
                    continue;
                long l = new Long(time);
                Date date = new Date(l);
                String t = formatter.format(date);
    
                String result = pre+"?bulletinId="+id+"&announceTime="+t;
                url.add(result);
                System.out.println(secname+":"+title);
            }}catch(Exception e){
                e.printStackTrace();
            }
            //System.out.println(ja.size());
            return url;
        }
        public static void readFile(String file){
            try{
                BufferedReader br = new BufferedReader(new FileReader(file));
                String str = br.readLine();
                while(str!=null){
                    json.add(str);
                    str = br.readLine();
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        public static void main(String[] args){
            //下载pdf
            readFile("json/json");
    
            for(String s:json)
                parse(s);
            DownloadThread t = new DownloadThread(url,-1);
            System.out.println(t.url.size());
            ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);  
            for (int i=0;i < 1430; i++) { 
                fixedThreadPool.execute(t);  
            }
            /*for(String s:url){
                DownLoadFile.downloadFile(s,"AnnualReport//");
            }*/
        }
    }

    截图

    下载文件

    展开全文
  • 述职报告 岗位资料 1 参与过的项目 2 负责的工作 3 技能展示 4 自身分析 5 未来规划 6 目 录 岗位资料 部 门 姓 名 入职时间 现任职务java开发 岗位职责 1参与项目评审 2负责数据库设计装维快线项目 3负责报表的数据...
  • 但是在很多时候,分析人员甚至最终报表使用者会发现数据质量的问题,比如某产品的型号大小写不对造成无法合并统计、某客户的归属城市错误造成业绩计算错误…,如果没有数据采集能力就必须由技术人员通过关系数据库...

    为什么需要数据采集

    首先数据采集是在跨库查询能力之上的补充功能,在Smartbi V9的数据源管理中,用户可以通过上传文件(Excel、CSV、TXT)将本地原始数据补充到数据平台中,和其它企业内部数据(关系型数据)一起用于后续的语义层封装和关联查询。

    在这里插入图片描述

    但是在很多时候,分析人员甚至最终报表使用者会发现数据质量的问题,比如某产品的型号大小写不对造成无法合并统计、某客户的归属城市错误造成业绩计算错误…,如果没有数据采集能力就必须由技术人员通过关系数据库后台操作进行数据修改,从而引发一些安全性隐患。此外,企业用户可能会有一些临时性需要收集的数据,这些采集需求并不复杂且采集的数据仅仅用于数据关联分析,如果协调企业OA就会有些困难。这样就对BI系统自身的数据采集能力提出了需求。

    数据采集的功能和亮点

    Smartbi数据采集提供以下功能:
    1、数据的修改和维护,开发人员设计可以修改数据的清单表,发布后最终用户在浏览器或者APP上直接修改并保存到数据库中;
    2、数据的填写和采集,开发人员设计交叉表、表单或者问卷,发布后最终用户在浏览器或者APP上输入数据并保存到数据库中;
    3、对已经有Excel模板(固定格式)的数据采集,可以设计Excel模板导入功能,直接将Excel中数据保存到数据库中;

    在这里插入图片描述

    其中前2种功能最常用,也是Smartbi数据采集的特色,采集的页面与修改数据的界面等同起来设计,看到的数据不正确就可以修改,而且即时生效无须等待。当然,这种具有回写(Write-back)功能的报表,是依赖预定义的资源权限的,以保证数据的安全性。

    从回写报表设计上,同样基于Excel插件方式的电子表格,与中国式报表的设计没有任何区别,只是定义了“回写规则”,将单元格与数据库进行了映射,参考界面如下:

    在这里插入图片描述

    在回写定义中,可以指定数据回写的目标数据库和表,以及约定回写的内容只是用户修改过的,还有更新和插入的具体规则等。最终界面上的回写操作支持删除行、添加行、清空数据修改记录等。

    此外,Smartbi数据采集还提供可回写单元格的填报属性,从源头管控数据质量,包括输入数据格式的校验、下拉选择列表的定义(支持Excel数据序列或者系统内置参数)、作为附件上传的文件规则等。如果你是高手,还可以使用“正则表达式”,更严格控制数据的输入质量。
    应用案例
    在这里插入图片描述

    海尔.jpg

    马上体验
    官网体验中心提供了3个示例,一个是10个车企的2015-2019年度销量目标的维护,一个是电子表格应用大会热销车Excel数据到导入,一个是给销售人员上传头像照片,便于直观了解Smartbi数据采集的能力。

    如果对Smartbi的数据采集功能感兴趣,想自己制作带有回写规则的表格(结合本地数据库),建议免费下载安装以及申请试用License,遇到安装和使用问题可向官方在线文档和产品论坛寻求帮助。

    展开全文
  • 10万字208道Java经典面试题总结(附答案,建议收藏) 一、Java基础知识 1、基础知识 分类 内容 链接 Java基础 【Java知识点详解 1】缓存 ...
  • 摘要:2020年,喜茶在产品研发、营运能力、供应链能力等全方位的实力上不断提升,为自身稳健快速发展构筑起坚实的底盘。 来源:喜茶 如需查看完整报告报告下载或了解更多...
  • Java报表之JFreeChart

    2019-06-11 16:19:05
    dateaxis.setDateFormatOverride(new java.text.SimpleDateFormat("M月")); dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.MONTH,1)); 设置曲线是否显示数据点 //设置曲线是否显示数据点 ...
  • mybaits3.3 SSM 普通java web(非maven, 附赠pom.xml文件)  数据库: mysql 3.开发工具 :myeclipse eclipse idea 均可, 没有限制. 我这边myeclipse 2014 导出来的项目源码 ---------...
  • java统计大屏,按月份/天进行统计,没有数据时补0需求来源如何插入一段漂亮的代码片 需求来源 将数据库中的数据,按照月份或者按照天进行统计 如何插入一段漂亮的代码片 天-工具类 import org.joda.time.Days; import ...
  • SQL编辑器:强大的SQL编辑器,支持编辑语句复杂查询语句,生成动态报表,可导出excel 菜单权限:分配给每个角色不同的菜单权限, 每个角色看到的菜单不同,无限级别菜单 按钮权限:独立分配不同的角色不同的功能权限...
  • import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io....
  • 先来看一张编程语言图谱,了解一下 Java 最近20 年到底有多火。 从趋势图可以看出,Java 在最近 20 年里一直处于前三的位置,可见受欢迎的程度还是很高的。 好了,废话不多,直接上干货项目,如果觉得有价值,记得 ...
  • //附表1 当前年度月报上报情况 SgMessageReportFinalFj2Example finalFj2Example = new SgMessageReportFinalFj2Example(); finalFj2Example.createCriteria().andAttr1EqualTo(year).andAttr2EqualTo(month);...
  • 摘要:大众旅游20年的快速、稳定和纵深发展,为国民休闲营造了坚实的产业氛围。休闲内容趋向多元,文化休闲比重不断提升,购物类、旅游类休闲仍是主要休闲方式。 来源:中国旅游研究院 ...
  • JAVA年度安全 第七周 内容安全策略

    千次阅读 2014-05-25 21:44:25
    http://www.jtmelton.com/2012/02/14/year-of-security-for-java-week-7-content-security-policy/ What is it and why should I care? 内容安全策略(CSP)由Mozilla推出的新技术,在WEB应用上新增一个防护层,主要...
  • java打印Excel表格

    千次阅读 2018-03-26 11:14:46
    这里用servlet简单介绍一下java打印报表 1.无合并行/列 package weaver.xhyy.servlet; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; ...
  • (3)销售管理:记录销售和退货的基本信息,并且生成季度报表和年度报表。 (4)库存管理:主要是对库存商品的价格进行调动和对仓库进行盘点。 (5)基础信息管理:主要是对客户、商品和供应商档案信息进行添加、...
  • java面试突击

    千次阅读 2020-02-23 11:51:27
    举个 简单的例子:一般情况下你的简历上注明你会的东西才会被问到(Java、数据结构、网络、算法这些基础是每个人必 问的),比如写了你会 redis,那面试官就很大概率会问你 redis 的一些问题。比如:redis的常见数据...
  • Java 填充模板

    2021-09-11 17:06:39
    } /** * 模板替换 */ public InputStream print(InputStream in, ConBase conBase, List info) { // 模板全的路径 //String templatePaht = "D:\\物料制作年度框架协议.docx"; // 输出位置 String outPath = "D:\\...
  • 1.TimeSeries,TimeSeriesCollection 引入 package ... import java.awt.Font; import java.io.IOException; import javax.servlet.http.HttpSession; import org.jfree.chart.ChartFactory; impo
  • 摘要:力求全面、详实地反映 2020 年影视行业 市场情况和法治现状,并提出法律建议,供行业参考借鉴 来源:北京文化娱乐法学会 如需查看完整报告报告下载或了解更多,微信公众号:行业...
  • 注:本篇章的flink学习均是基于java开发语言 ...对数据进行批量处理,对数据实时性邀请不高,比如生成离线报表、月汇总,支付宝年度账单(一年结束批处理计算) - Streaming Analytics 流式计算,顾名思义,就是
  • 摘要:2020年特殊时期下,让人们有了更多居家的时间,也重新开始审视健康与家庭生活的关系。日化行业也在冲击中,不断寻找新的生机。 来源:巨量算数 如需查看完整报告报告...
  • 工作java工作总结

    千次阅读 2017-12-14 00:03:36
    java后端1年经验和技术总结(1)  1.引言   毕业已经一年有余,这一年里特别感谢技术管理人员的器重,以及同事的帮忙,学到了不少东西。这一年里走过一些弯路,也碰到一些难题,也受到过做为一名开发却经常为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,045
精华内容 818
关键字:

java年度报表

java 订阅