利用poi实现对数据清洗

利用poi实现对数据清洗

1.数据清洗

1.1.什么是数据清洗

数据清洗(Data cleaning)– 对数据进行重新审查和校验的过程,目的在于删除重复信息、纠正存在的错误,并提供数据一致性。

数据清洗从名字上也看的出就是把“脏”的“洗掉”,指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。因为数据仓库中的数据是面向某一主题的数据的集合,这些数据从多个业务系统中抽取而来而且包含历史数据,这样就避免不了有的数据是错误数据、有的数据相互之间有冲突,这些错误的或有冲突的数据显然是我们不想要的,称为“脏数据”。我们要按照一定的规则把“脏数据”“洗掉”,这就是数据清洗。而数据清洗的任务是过滤那些不符合要求的数据,将过滤的结果交给业务主管部门,确认是否过滤掉还是由业务单位修正之后再进行抽取。不符合要求的数据主要是有不完整的数据、错误的数据、重复的数据三大类。数据清洗是与问卷审核不同,录入后的数据清理一般是由计算机而不是人工完成

1.2.数据清洗的步骤

数据清洗的步骤相对较为简单与清晰,有两个阶段:

  • 第一步:偏差检测(Discrepancy Detection):即检查导致偏差的因素,并识别离散值与噪声值,例如我们采取的数据是否具有代表性,数据量是否足够,偶然因素,其他因素等的影响,这些都是能够体现数学模型上的离散值和噪声值

  • 第二步:数据清洗(Data Cleansing):即处理缺失值与噪声。

1.3.数据清洗的方法

  • 缺失数据填补
    填补缺失值的方法有如下3大类:
  • 直接删除:
    可以删除带有缺失值的记录,也可直接删除有缺失值的属性。但在实际中不太有效,尤其是在缺失值变化多,跨多个自变量的情况下。
  • 人工填写:
    用人手工填写上确实的值,听上去就不实际且费时间。大数据的分析可以直接忽略这个方法。
  • 自动填充:
    这个方法是目前用的最为广泛的。顾名思义,用某些值自动填充缺失值。依照自动填充的值不同做出清洗

1.4.那么我们该怎么实现数据清洗呢?

备注:其实不需要我们干,因为这些往往都是有专门的岗位或者部门进行的,例如算法工程师出算法,大数据工程师进行实现,运用大数据的相关框架/知识进行清洗。

ps:那么我们该怎么实现数据清洗呢,我们的做法是对爬虫获取到的数据实现统计求和或者去重排序等

导读模块:我们本次的清洗就是将三个excel中的薪水,进行归类统计,对面议和其他等这些情况的薪水忽略不计

2.1.使用poi实现对excel的写入(2003版本的Excel)

package com.Li.poi;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import jxl.Workbook;
/**
 * @Description:   使用  HSSFWorkbook  poi jar    实现写入Excel
 * @auther:Li Ya Hui
 * @Time:2021年4月29日下午1:51:42
 */
public class Test {

	public static void main(String[] args) throws IOException {
		//1.使用  HSSFWorkbook  poi jar创建一个workbook对象
		HSSFWorkbook workbook = new HSSFWorkbook();
		//2.创建sheet
		HSSFSheet sheet = workbook.createSheet();
		//3.创建第一行对象
		HSSFRow row = sheet.createRow(0);
		//4.写入表头
		String[] biaotouStrings = {"编号","姓名"};
		for (int i = 0; i < biaotouStrings.length; i++) {
			//创建列    创建单元格
			HSSFCell cell = row.createCell(i);
			//写入值
			cell.setCellValue(biaotouStrings[i]);
		}
		//5.向表头下写入20条数据
		for (int i = 1; i < 20; i++) {
			//创建行
			HSSFRow row2 = sheet.createRow(i);
			//创建每行的第一列
			HSSFCell cell01 = row2.createCell(0);
			//写入第一列的值
			cell01.setCellValue(i);
			//创建第二列
			HSSFCell cell02 = row2.createCell(1);
			//写入第二列的值
			cell02.setCellValue("00_"+i);
		}
		//6.指定文件的路径
		File file = new File("E://poi_Excell//poi_one.xls");
		//7.初始化文件输出流对象
		FileOutputStream fileOutputStream = new FileOutputStream(file);
		//8.将数据写入文件
		workbook.write(fileOutputStream);
		//9.刷新  fileOutputStream  数据
		fileOutputStream.flush();
		//10.关闭相对应的流对象
		fileOutputStream.close();
		workbook.close();
	}
}

2.2.poi实现读取excel中的数据(2003版本的Excel)

package com.Li.poi;

import java.io.FileInputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.xmlbeans.impl.xb.xsdschema.TotalDigitsDocument.TotalDigits;
/**
 * @Description:  实现Poi的读取Excel中的数据
 * @auther:Li Ya Hui
 * @Time:2021年4月29日下午2:15:54
 */
public class Test02 {
	public static void main(String[] args) throws Exception {
		//1.文件的路径
		String pathName = "E://poi_Excell//poi_one.xls";
		//2.将需要解析的excel转为流进行输出
		FileInputStream fileInputStream = new FileInputStream(pathName);
		//3.实例化poi的核心类
		HSSFWorkbook workbook = new HSSFWorkbook(fileInputStream);
		//4.获取当前的Excel的第一个sheet 也就是第一个页
		HSSFSheet sheet = workbook.getSheetAt(0);
		//5.获取当前sheet有多少个行
		int totalRows = sheet.getPhysicalNumberOfRows();
		//6.循环读取每一行
		for (int i = 0; i < totalRows; i++) {
			//取出每一行
			HSSFRow row = sheet.getRow(i);
			//获取一共有多少列
			int totalCellNums = row.getPhysicalNumberOfCells();
			//循环每一行的每一列
			for (int j = 0; j < totalCellNums; j++) {
				 //获取单元格
				 HSSFCell cell = row.getCell(j);
				 //获取值
				 //获取值的函数有缺陷  自己写一个函数
				   String CellValue = getValue(cell);
				 //输出值
				 System.out.print(CellValue+"\t");
			}
			System.out.println();
		}
	}
	/**
	 * @desc 自定义函数 -- 格式化输出
	 * @param cell
	 * @return
	 */
	//获取各种类型的cell
	public static String getValue(Cell cell)
	{
		//判断是否是数字类型  单元格的 值
		if (cell.getCellType()==Cell.CELL_TYPE_NUMERIC)//数字单元格
		{
			//返回时将值使用valueof 传出去
			return  String.valueOf((int) cell.getNumericCellValue()); 
		}
		else if(cell.getCellType()==Cell.CELL_TYPE_BOOLEAN) //
		{
			return String.valueOf(cell.getBooleanCellValue());
		}
		//返回字符串类型的值
		return cell.getStringCellValue();
	}
}

2.3.poi操作excel2007+版本的解析 (2007+版本的Excel)

导读模块:随着Excel的版本更新,现在的市面上有一部分人是使用Excel2003当然也有一部分人是使用excel2007+,为此我们该怎么办呢?其实poi已经帮我们做好了,至于解析高版本的excel2007+与2003版本比较只是核心的类发生了更改,其步骤和思路都没变化

excel2007:XSSFWorkbook ---->XSSFSheet ---->XSSFRow—>XSSFCell
package com.Li.poi;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import jxl.Workbook;
/**
 * @Description:   使用    poi  实现写入Excel (2007+版本的Excel)
 * @auther:Li Ya Hui
 * @Time:2021年4月29日下午1:51:42
 */
public class Test03 {

	public static void main(String[] args) throws IOException {
		//1.使用  HSSFWorkbook  poi jar创建一个workbook对象
//		HSSFWorkbook workbook = new HSSFWorkbook();
		XSSFWorkbook workbook = new XSSFWorkbook();
		//2.创建sheet
//		HSSFSheet sheet = workbook.createSheet();
		XSSFSheet sheet = workbook.createSheet();
		//3.创建第一行对象
//		HSSFRow row = sheet.createRow(0);
		XSSFRow row = sheet.createRow(0);
		//4.写入表头
		String[] biaotouStrings = {"编号","姓名"};
		for (int i = 0; i < biaotouStrings.length; i++) {
			//创建列    创建单元格
//			HSSFCell cell = row.createCell(i);
			XSSFCell cell = row.createCell(i);
			//写入值
			cell.setCellValue(biaotouStrings[i]);
		}
		//5.向表头下写入20条数据
		for (int i = 1; i < 20; i++) {
			//创建行
//			HSSFRow row2 = sheet.createRow(i);
			XSSFRow row2 = sheet.createRow(i);
			//创建每行的第一列
//			HSSFCell cell01 = row2.createCell(0);
			XSSFCell cell01 = row2.createCell(0);
			//写入第一列的值
			cell01.setCellValue(i);
			//创建第二列
//			HSSFCell cell02 = row2.createCell(1);
			XSSFCell cell02 = row2.createCell(1);
			//写入第二列的值
			cell02.setCellValue("00_"+1);
		}
		//6.指定文件的路径
		File file = new File("E://poi_Excell//poi_one.xlsx");
		//7.初始化文件输出流对象
		FileOutputStream fileOutputStream = new FileOutputStream(file);
		//8.将数据写入文件
		workbook.write(fileOutputStream);
		//9.刷新  fileOutputStream  数据
		fileOutputStream.flush();
		//10.关闭相对应的流对象
		fileOutputStream.close();
		workbook.close();
	}
}

2.4.利用poi实现同时 解析 2003 和 2007的excel

package com.Li.poi;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * @Description:  利用poi实现同时  解析  2003 和 2007的excel
 * @auther:Li Ya Hui
 * @Time:2021年4月29日下午3:47:09
 */
public class Test04 {
	public static void main(String[] args) throws IOException {
		//创建一个workbook接口对象
		Workbook wb = null;
		//创建一个sheet接口对象
		Sheet sheet = null;
		//创建一个Row接口对象
		Row row = null;
		//创建一个Cell接口对象
		Cell cell = null;
		String pathname = "E:\\poi_Excell\\poi_one.xlsx"; 
		//将excel转变为file对象
		File file = new File(pathname);
		//2.将file对象转变为流对象
		FileInputStream fileInputStream = new FileInputStream(file);
		//3.判断
		if(file.isFile()&&file.exists()) 
		{
			//3.1获取当前的excel的名字
			String fileName = file.getName();
			System.out.println(fileName);
			//3.2获取文件的后缀
			int st = fileName.lastIndexOf(".");
			CharSequence suffix = fileName.subSequence(st+1, fileName.length());
			//3.3通过文件的后缀实现多路判断
			if(suffix.equals("xls")) 
			{
				System.out.println("走2003解析");
				//不同的核心类
				wb = new HSSFWorkbook(fileInputStream);
			}
			else if(suffix.equals("xlsx"))
			{
				System.out.println("走2007解析");
				//不同的核心类
				wb = new XSSFWorkbook(fileInputStream);
			}
			else 
			{
				System.out.println("当前文件不能解析,退出程序");
				System.exit(0);
			}
		}
		//4.获取当前的Excel的第一个sheet 也就是第一个页
		sheet =  wb.getSheetAt(0);
		//5.获取当前sheet有多少个行
		int totalRows = sheet.getPhysicalNumberOfRows();
		//6.循环读取每一行
		for (int i = 0; i < totalRows; i++) {
			//取出每一行
			row = sheet.getRow(i);
			//获取一共有多少列
			int totalCellNums = row.getPhysicalNumberOfCells();
			//循环每一行的每一列
			for (int j = 0; j < totalCellNums; j++) {
				 //获取单元格
				 cell = row.getCell(j);
				 //获取值
				 //获取值的函数有缺陷  自己写一个函数
				   String CellValue = getValue(cell);
				 //输出值
				 System.out.print(CellValue+"\t");
			}
			System.out.println();
		}
	}
	/**
	 * @desc 自定义函数 -- 格式化输出
	 * @param cell
	 * @return
	 */
	//获取各种类型的cell
	public static String getValue(Cell cell)
	{
		//判断是否是数字类型  单元格的 值
		if (cell.getCellType()==Cell.CELL_TYPE_NUMERIC)//数字单元格
		{
			//返回时将值使用valueof 传出去
			return  String.valueOf((int) cell.getNumericCellValue()); 
		}
		else if(cell.getCellType()==Cell.CELL_TYPE_BOOLEAN) //
		{
			return String.valueOf(cell.getBooleanCellValue());
		}
		//返回字符串类型的值
		return cell.getStringCellValue();
	}
}

2.5.利用poi实现对数据的清洗

package com.Li.flushs;
/**
 * @Description:  利用POI构建一个工具类
 * @auther:Li Ya Hui
 * @Time:2021年4月29日下午5:40:53
 */

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class FileUtils {
	//通过路径获取不同版本的excel
	public Workbook getWorkbook(String pathname) throws IOException 
	{
		//创建一个workbook接口对象
		Workbook wb = null;
		//创建一个sheet接口对象
		Sheet sheet = null;
		//创建一个Row接口对象
		Row row = null;
		//创建一个Cell接口对象
		Cell cell = null;
		//将excel转变为file对象
		File file = new File(pathname);
		//2.将file对象转变为流对象
		FileInputStream fileInputStream = new FileInputStream(file);
		//3.判断
		if(file.isFile()&&file.exists()) 
		{
			//3.1获取当前的excel的名字
			String fileName = file.getName();
			System.out.println(fileName);
			//3.2获取文件的后缀
			int st = fileName.lastIndexOf(".");
			CharSequence suffix = fileName.subSequence(st+1, fileName.length());
			//3.3通过文件的后缀实现多路判断
			if(suffix.equals("xls")) 
			{
				System.out.println("走2003解析");
				//不同的核心类   HSSFWorkbook
				wb = new HSSFWorkbook(fileInputStream);
			}
			else if(suffix.equals("xlsx"))
			{
				System.out.println("走2007解析");
				//不同的核心类 XSSFWorkbook
				wb = new XSSFWorkbook(fileInputStream);
			}
			else 
			{
				System.out.println("当前文件不能解析,退出程序");
				System.exit(0);
			}
		}
		return wb;
	}
	//2.读取每一个Excel中的薪水这列的值,然后存入到容器中
	public List<String> getCellData(Workbook workbook , int sheetNum , int beginColumn , int endColumn)
	{
		Sheet sheet = null;
		Row row = null;
		Cell cell = null; 
		List<String> list = new ArrayList<String>();
		//4.获取当前的Excel的第一个sheet 也就是第一个页
		sheet =  workbook.getSheetAt(0);
		//5.获取当前sheet有多少个行
		int totalRows = sheet.getPhysicalNumberOfRows();
		//6.循环读取每一行
		for (int i = 0; i < totalRows; i++) {//外循环获取到的excel中的行
			//取出每一行
			row = sheet.getRow(i);
			//获取一共有多少列
			int totalCellNums = row.getPhysicalNumberOfCells();
			//循环每一行的每一列
			for (int j = beginColumn; j <= endColumn; j++) {//外循环获取到的excel中的列
				 //获取单元格
				 cell = row.getCell(j);
				 //获取值
				 String CellValue = getValue(cell);
				 list.add(CellValue);
			}
		}
		return list;
	}
	/**
	 * @desc 自定义函数 -- 格式化输出
	 * @param cell
	 * @return
	 */
	//获取各种类型的cell
	public String getValue(Cell cell)
	{
		//判断是否是数字类型  单元格的 值
		if (cell.getCellType()==Cell.CELL_TYPE_NUMERIC)//数字单元格
		{
			//返回时将值使用valueof 传出去
			return  String.valueOf((int) cell.getNumericCellValue()); 
		}
		else if(cell.getCellType()==Cell.CELL_TYPE_BOOLEAN) //
		{
			return String.valueOf(cell.getBooleanCellValue());
		}
		//返回字符串类型的值
		return cell.getStringCellValue();
	}
}

//测试类
package com.Li.flushs;

import java.io.IOException;
import java.util.List;

import org.apache.poi.ss.usermodel.Workbook;

/**
 * @Description: 测试类 :测试利用poi获取excel中的数据,然后归类统计
 * @auther:Li Ya Hui
 * @Time:2021年4月29日下午7:40:53
 */
public class Test {

	public static void main(String[] args) throws IOException {
		String pathName = "E:\\招聘\\zhyc_java.xls";
		FileUtils fileUtils = new FileUtils();
		Workbook workbook = fileUtils.getWorkbook(pathName);
		List<String> a = fileUtils.getCellData(workbook, 0, 2, 2);
		for (String string : a) {
			System.out.println(string);
		}
	}
}

2.6.利用poi实现对数据 薪水的清洗

package com.Li.flushs;
/**
 * @Description:  利用POI构建一个工具类
 * @auther:Li Ya Hui
 * @Time:2021年4月29日下午5:40:53
 */

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class FileUtils {
	//通过路径获取不同版本的excel
	public Workbook getWorkbook(String pathname) throws IOException 
	{
		//创建一个workbook接口对象
		Workbook wb = null;
		//创建一个sheet接口对象
		Sheet sheet = null;
		//创建一个Row接口对象
		Row row = null;
		//创建一个Cell接口对象
		Cell cell = null;
		//将excel转变为file对象
		File file = new File(pathname);
		//2.将file对象转变为流对象
		FileInputStream fileInputStream = new FileInputStream(file);
		//3.判断
		if(file.isFile()&&file.exists()) 
		{
			//3.1获取当前的excel的名字
			String fileName = file.getName();
			System.out.println(fileName);
			//3.2获取文件的后缀
			int st = fileName.lastIndexOf(".");
			CharSequence suffix = fileName.subSequence(st+1, fileName.length());
			//3.3通过文件的后缀实现多路判断
			if(suffix.equals("xls")) 
			{
				System.out.println("走2003解析");
				//不同的核心类   HSSFWorkbook
				wb = new HSSFWorkbook(fileInputStream);
			}
			else if(suffix.equals("xlsx"))
			{
				System.out.println("走2007解析");
				//不同的核心类 XSSFWorkbook
				wb = new XSSFWorkbook(fileInputStream);
			}
			else 
			{
				System.out.println("当前文件不能解析,退出程序");
				System.exit(0);
			}
		}
		return wb;
	}
	//2.读取每一个Excel中的薪水这列的值,然后存入到容器中
	public List<String> getCellData(Workbook workbook , int sheetNum , int beginColumn , int endColumn)
	{
		Sheet sheet = null;
		Row row = null;
		Cell cell = null; 
		List<String> list = new ArrayList<String>();
		//4.获取当前的Excel的第一个sheet 也就是第一个页
		sheet =  workbook.getSheetAt(0);
		//5.获取当前sheet有多少个行
		int totalRows = sheet.getPhysicalNumberOfRows();
		//6.循环读取每一行
		for (int i = 0; i < totalRows; i++) {//外循环获取到的excel中的行
			//取出每一行
			row = sheet.getRow(i);
			//获取一共有多少列
			int totalCellNums = row.getPhysicalNumberOfCells();
			//循环每一行的每一列
			for (int j = beginColumn; j <= endColumn; j++) {//外循环获取到的excel中的列
				 //获取单元格
				 cell = row.getCell(j);
				 //获取值
				 String CellValue = getValue(cell);
				 list.add(CellValue);
			}
		}
		return list;
	}
	/**
	 * @desc 自定义函数 -- 格式化输出
	 * @param cell
	 * @return
	 */
	//获取各种类型的cell
	public String getValue(Cell cell)
	{
		//判断是否是数字类型  单元格的 值
		if (cell.getCellType()==Cell.CELL_TYPE_NUMERIC)//数字单元格
		{
			//返回时将值使用valueof 传出去
			return  String.valueOf((int) cell.getNumericCellValue()); 
		}
		else if(cell.getCellType()==Cell.CELL_TYPE_BOOLEAN) //
		{
			return String.valueOf(cell.getBooleanCellValue());
		}
		//返回字符串类型的值
		return cell.getStringCellValue();
	}
}
//测试类
package com.Li.flushs;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.ss.usermodel.Workbook;

/**
 * @Description: 测试类 :测试利用poi获取excel中的数据,然后归类统计
 * @auther:Li Ya Hui
 * @Time:2021年4月29日下午7:40:53
 */
public class Test {

	public static void main(String[] args) throws IOException {
		//创建一个List将执行后获取到的list存起来
		List<List<String>> list  = new ArrayList<List<String>>();
		int h=0,m=0,w=0;
		for (int i = 1; i <= 3; i++) {
			String pathName = "E:\\招聘\\zhyc_java0_"+i+".xls";
			FileUtils fileUtils = new FileUtils();
			Workbook workbook = fileUtils.getWorkbook(pathName);
			List<String> resultList = fileUtils.getCellData(workbook, 0, 2, 2);
			list.add(resultList);//将获取到的三个excel中的薪水存入到list容器中
//			System.out.println(resultList);
		}
		/**
		 *数据清洗的规则
		 * 1.只要不是数字的,都给舍弃
		 * 2.根据薪水高低划定三个层次即
		 * 12000以上:高收入,即h
		 * 8000-12000:中等收入即m
		 * 8000以下的:低等收入,即w
		 * 
		 * 
		 */
		for (int i = 0; i < list.size(); i++) {
			  List<String> everyResultList = list.get(i);//每一个excel中的薪水所在的容器
			  for (int j = 0; j < everyResultList.size(); j++) {
				  String everyResult = everyResultList.get(j);//每一个excel中的每一条的薪水
//				  System.out.println("everyResult:\t"+everyResult);
				  //根据清洗规则
				  if(!(everyResult.startsWith("其他")||everyResult.startsWith("薪")||everyResult.startsWith("面议"))) 
				  {
//					  System.out.println(everyResult);
					  //起始位置
					  int st = everyResult.lastIndexOf("-");//注意这个,建议要粘贴excel中的
					  //每一个具体薪水
					   String ft = (String) everyResult.subSequence(0, st);
					   int xinshui =Integer.parseInt(ft);
					   System.out.println(xinshui);
					  //判断
					  if(xinshui>=12000) 
					  {
						  h++;
					  }else if(xinshui>=8000)
					  {
						  m++;
					  }else 
					  {
						  w++;
					  }
				  }
			  }
		}
		
		System.out.println("12000以上的有"+h+"个");
		System.out.println("8000-12000以上的有"+m+"个");
		System.out.println("8000以下的有"+w+"个");
		
	}  
}

3.什么是数据可视化

  1. 数据可视化:
    • 是关于数据视觉表现形式的科学技术研究。其中,这种数据的视觉表现形式被定义为,一种以某种概要形式抽提出来的信息,包括相应信息单位的各种属性和变量。
    • 它是一个处于不断演变之中的概念,其边界在不断地扩大。主要指的是技术上较为高级的技术方法,而这些技术方法允许利用图形、图像处理、计算机视觉以及用户界面,通过表达、建模以及对立体、表面、属性以及动画的显示,对数据加以可视化解释。与立体建模之类的特殊技术方法相比,数据可视化所涵盖的技术方法要广泛得多
  2. 数据可视化的分类
    • 广义上,可视化无处不在。网站是数据可视化, 背后是数据库密密麻麻的数据表, 到了浏览器就是浅显易懂的页面;淘宝是商品的可视化, 上面有价格、发货地种种过滤器;微信是实时数据的可视化, 围起了你的社交网络, 让你一眼看到最新的消息流。

    • 狭义上的数据可视化, 更多是纯图形去代表数据

  3. 那么我们就是从狭义的角度去分析和实现数据可视化
    • 我们都知道前几天我们通过爬虫获取到了一些数据,那么这些数据如果让我们逐条去看的话 我们会发现很多,很费劲,于是我就提出了从数据可视化的角度去分析和展示数据,那么到底该怎么展示呢?到底该怎么处理呢?
    • 至于处理,我们采取的是数据清洗,那么这些数据清洗都包括什么呢?稍后我们可以看到相应的专题,那么数据该怎么展示呢?我么采取的是图表的形式(因为我么并没有学习到servlet等技术呢,所以先暂时只能这样了)
数据化导读

1.能够操作excel的第三方jar包:jxl,poi, Jxcell(收费)
2.但是这些基本上都不能直接操作excel实现可视化的图表,为此我们要转变一下思路,看看能不能间接的实现
3.经研究发现我们可以有以下几种方法:
1)java 调取 excel的宏(宏是什么,很难写,而且写的时候要该出权限才能写,然后是用Java代码调用)
2)使用Jxcell但是这个是收费的,且版本比较老旧,对JDK1.6之后支持不是很好
3)使用poi+JfreeChart这个能够很好实现操作excel实现可视化的图表,但是因为JfreeChart是比较老的产物,产生的图表比较丑
4)用poi+excel模板(其实就是实现定义好一个excel图表,但是建议使用2003之后的excel版本,不然可能效果出不来),可以参考F:/123.xlsx

3.1.两种赋值excel公式的方法

3.1.1获取单元格公式workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();
  • workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();

  • FileOutputStream out = new FileOutputStream(new File(“formula.xlsx”));

  • workbook.write(out);

3.1.2.获取单元格公式 页 sheet.setForceFormulaRecalculation(true);
  • FileInputStream fileInputStream = new FileInputStream(“E:\poi_Excell\123.xlsx”);
  • XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fileInputStream);
  • XSSFSheet sheet = xssfWorkbook.getSheetAt(0);
  • xssfWorkbook.setSheetName(0, “sheet0”);
  • 存储当前表格的样式
  • XSSFCellStyle cellStyle = xssfWorkbook.createCellStyle();

3.2案例展示

package com.Li.flushs;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * @Description: poi+excel模板实现数据可视化  之 excel的模板复制
 * @auther:Li Ya Hui
 * @Time:2021年4月30日下午1:11:58
 */
public class Test02 {
	public static void main(String[] args) throws IOException {
		//1.将模板文件转变为流对象
		FileInputStream fileInputStream = new FileInputStream("E:\\poi_Excell\\123.xlsx");
		//2.创建输出流对象
		FileOutputStream fileOutputStream =new FileOutputStream("E:\\poi_Excell\\2021-04-30.xlsx");
		//3.初始化poi核心类
		XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fileInputStream);
		//3.1获取原模板即123.xlsx的第一页
		XSSFSheet sheet = xssfWorkbook.getSheetAt(0);
		
		//两种获取公式的方法
	    //3.2自动计算
//        sheet.setForceFormulaRecalculation(true);
        //3.3给指定的sheet命名
        xssfWorkbook.setSheetName(0, "sheet0");
        //4.存储当前表格的样式
        XSSFCellStyle cellStyle = xssfWorkbook.createCellStyle();
		
        //5.给excel模板中的四行数据第一列重新赋值
        String [] mingcheng = {"java","php","python","C++"};//名称
		  
		//7.获取sheet四行数  赋值
        for (int i = 0; i < mingcheng.length; i++) {
			XSSFRow row = sheet.getRow(i);
			XSSFCell cell = row.getCell(0);
			cell.setCellValue(mingcheng[i]);
		}
       //8.给excel模板中的四行数数据的第二列重新赋值
        int [] shuLiang = {800,500,260,100};//数量
        for (int i = 0; i < shuLiang.length; i++) {
			XSSFRow row = sheet.getRow(i);
			XSSFCell cell = row.getCell(1);
			cell.setCellValue(shuLiang[i]) ;
		}
        //两种获取公式的方法
        xssfWorkbook.getCreationHelper().createFormulaEvaluator().evaluateAll();
        //9.写入
        xssfWorkbook.write(fileOutputStream);
        //10.关闭流对象
        fileOutputStream.close();
        fileInputStream.close();
        xssfWorkbook.close();
		
	}
}

4.数据分析(了解)

导读模块:可能看到这个模块的时候有很多的同学会觉得有点重复,其实不然,当数据清洗之后,我们也可以能够可视化了,那么是不是能够做出决策了,这些还不够的,因为商业的投资是需要严谨和细心的,毕竟钱是很重要的
那么我们该怎么实现数据分析呢?

1.数据分析:是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。这一过程也是质量管理体系的支持过程。在实用中,数据分析可帮助人们作出判断,以便采取适当行动。
数据分析的数学基础在20世纪早期就已确立,但直到计算机的出现才使得实际操作成为可能,并使得数据分析得以推广。数据分析是数学与计算机科学相结合的产物

补充:数据分析是一门年轻且很有发展的学科

2.数据分析主要包含:
1)简单数学运算(Simple Math)
2) 统计(Statistics)
3)快速傅里叶变换(FFT)
4) 平滑和滤波(Smoothing and Filtering)
5)基线和峰值分析(Baseline and Peak Analysis)

3.听起来好难啊,我们该怎么学习啊,哈哈 ,这个不需要我们学习的,因为这个也是有专门的岗位或者部门的,毕竟现在的复杂的商业不是一个人能独立完成的,现在要讲究team合作

4.额外拓展补充,那么该怎么去学习呢?掌握Python、Matlab这个工具、R语言,然后是SPSS平台(软件)的使用

5.商业决策

  1. 决策的目的
    军队中一直存在严格的工作优先顺序,所有决策均以此为基础。任务始终排在第一位,之后是符合团队利益的决定,最后才是与个人利益有关的决定。个人要放在最后,是因为在组织链中,个人永远是最小的环节。利己主义没有太大意义,在团队或组织中不应该考虑个人得失。

  2. 错误绝非永恒不变
    用“绝非”这个词或许有些过头,但你应该能明白我的意思。我之前曾说过,失败只是取决于你何时选择停止,同样也取决于人们如何看待具体问题。例如,在某个级别的人看来有些棘手的问题,在另一个级别的人眼中却未必是亟需解决的问题。尽可能收集更多观点,更加深入地理解具体情况。

  3. 执行的时间线
    内部和外部影响,会决定在给定的时间线内执行决策的可行性。内部影响是指你和团队在给定的时间内执行决策的能力,外部影响则是指影响最终期限的推动力,并且这些因素超出了你的控制范围,例如天气、经济或市场需求等。

  • 你要问自己两个问题。第一个问题是,“现在是做出决定的正确时机吗?”如果答案是肯定的,再问第二个问题:“我能执行这项决策吗?”如果答案是否定的,要搞清“为什么?”
  1. 已知的未知和未知的未知
  • 执行决策时,你会面临许多限制。

  • “已知的未知”是指你意识到一些无形限制的存在,但你无法进行具体量化,例如交通(如果你住在洛杉矶,你肯定知道我在说什么)。例如,你清楚洛杉矶的交通高峰时间从来都没有结束的时候,所以,你从A点到B点需要花的时间可能在20分钟到2个小时之间。关键在于,你清楚不确定性的存在,却不清楚这种不确定性的具体程度。

  • 根据墨菲定律,“未知的未知”就是你根本没有计划到的意外事件,比如(继续以交通为例)交通事故或发动机故障。

  • 尽量明确所有限制因素,这样你就知道如何让它们有利于实现决策目的。

  1. 资源的可用性
  • 如果你最初没能成功,要不断尝试。每一次努力的结果很大程度上取决你执行计划所使用的资源,所以不仅要确定可用的主要资源,还要确定次要资源。每一项决策都应该制定一项应对 “未知的未知”和主要行动方案失败等情形的应急方案。
  • 如果准备不充分,你会被决策过程击垮。回顾以上所说,或许会让你对自己的决策更有信心
  • 所以啊,有一个好的软件系统始终是给企业助力的
上一篇:POI 导出异常报错


下一篇:一个POI问题的解决过程