读写excel_python读写excel - CSDN
精华内容
参与话题
  • Java poi读写Excel文件

    千次阅读 2019-11-26 20:54:59
    导包 下载 poi-4.0.1.jar 并导入项目中 写文件 public static void write(){ //创建工作簿 Workbook wb = new HSSFWorkbook(); //创建A、B两个 Sheet 页 Sheet sheetA = wb.createSheet("A");......

    在自动化测试实现过程中,有一步是使用 Excel 管理测试用例,这就涉及到 Java 读取 Excel 文件的知识

    1、准备工作
    首先需要在 java 项目中导入相应的 jar 包,下载地址为:
    http://poi.apache.org/download.html#POI-4.1.1
    在这里插入图片描述可以下载4.0.1的poi,如果下载4.1.1版本,还需要下载commons-math3-3.6.1.jar 这个 jar 包,否则运行时可能报奇怪的错。

    2、向 Excel 中写入数据
    几个关键的语句:

    //创建Sheet页
    Sheet sheetA = wb.createSheet("A");
    //创建行,括号中的数字表示第几行,从0开始
    Row row = sheetA.createRow(0);
    //创建单元格,括号中的数字表示该行的第几列,从0开始
    Cell cell = row.createCell(0);
    //向单元格中写数据,可写入各种类型的数据(如Boolean,int,double,String等)
    cell.setCellValue("一");
    

    写一个 demo ,向 Excel 中写入乘法口诀表。完整代码如下:

      public static void testWrite(){
        //创建工作簿
        Workbook wb = new HSSFWorkbook();
        //创建 Sheet页
        Sheet sheetA = wb.createSheet("A");
        for(int i=0; i<9; i++){
            //创建单元行
          Row row = sheetA.createRow(i);
          for(int j=0; j<=i; j++){
            Cell cell = row.createCell(j);
            cell.setCellValue((j+1)+" * "+(i+1)+" = " + (j+1)*(i+1));
          }
        }    
        try {
         //路径需要存在
          FileOutputStream fos = new FileOutputStream("D:\\newExcel.xls");
          wb.write(fos);
          fos.close();
          wb.close();
          System.out.println("写数据结束!");
        } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }    
      }
    

    执行完成后,即可在D盘根目录下看到 newExcel.xls 文件

    3、从 Excel 中读取数据
    将刚刚写入的乘法口诀表读取并输出

    public static void read(){
    	try {
    		InputStream is = new FileInputStream("D:\\newExcel.xls");
    		POIFSFileSystem fs = new POIFSFileSystem(is);
    		HSSFWorkbook wb = new HSSFWorkbook(fs);
    		
    		//遍历Sheet页
    		for(int sheet=0; sheet < wb.getNumberOfSheets(); sheet++){
    			HSSFSheet s = wb.getSheetAt(sheet);
    			System.out.println(s.getSheetName());
    			if(s == null){
    				continue;
    			}
    			//遍历row
    			for(int row = 0; row <= s.getLastRowNum(); row++){
    				HSSFRow r = s.getRow(row);
    				if(r == null){
    					continue;
    				}
    				//遍历单元格 cell
    				for(int cell =0; cell <= r.getLastCellNum(); cell++){
    					HSSFCell c = r.getCell(cell);
    					if(c == null){
    						continue;
    					}
    					//判断单元格数据类型
    					switch (c.getCellType()) { 
    					case BOOLEAN: // Boolean类型的处理 
    						System.out.print(String.valueOf(c.getBooleanCellValue()) + "  "); 
    						break;
    					case NUMERIC: // 数字类型的处理 
    						System.out.print(String.valueOf(c.getNumericCellValue()) + "  "); 
    						break;
    					default: // 其他类型则按字符串处理 
    						System.out.print(String.valueOf(c.getStringCellValue()) + "  ");
    						break;
    					}
    				}
    				System.out.println();
    			}
    			System.out.println();
    		}
    		if(is != null){
    			is.close();
    		}
    		if(wb != null){
    			wb.close();
    		}
    	} catch (IOException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    }
    

    在读取数据时,有两点需要注意
    1)文件格式不能是2007版,否则无法读取
    在这里插入图片描述
    2)文件路径可以是绝对路径,也可以是项目下的相对路径,相对路径的获取方式为

    InputStream is = testRead().getClass().getResourceAsStream("/newExcel.xls");
    

    扫码关注微信公众号
    在这里插入图片描述

    展开全文
  • 读写excel

    2018-09-07 17:14:47
    package com.xiangshui; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util....imp...

    package com.xiangshui;

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

    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.Cell;
    import jxl.Sheet;
    import jxl.Workbook;
    import jxl.format.Alignment;
    import jxl.format.Border;
    import jxl.format.BorderLineStyle;
    import jxl.format.Colour;
    import jxl.format.UnderlineStyle;
    import jxl.read.biff.BiffException;
    import jxl.write.Label;
    import jxl.write.NumberFormats;
    import jxl.write.WritableCellFormat;
    import jxl.write.WritableFont;
    import jxl.write.WritableImage;
    import jxl.write.WritableSheet;
    import jxl.write.WritableWorkbook;
    import jxl.write.WriteException;

    /**
     * 读写excel
     * 处理excel的相关JAR包
     * @author liuqixiang
     * 所需JAR 包  jxl.jar,poi-3.8-20120326.jar,poi-ooxml-3.8-20120326.jar 
     * jar包位置 我的网盘/编程软件及工具包/工具包/处理excel的相关JAR包/
     *
     */
    public class ExcelUtils {
        
        /**
         * excel2003 即.xls
         * @author xiangshuai
         * excel 文件读取,并将excel的行记录封装到String[]数组中,将查出来的整个行记录--即string[] 用list进行存储
         * @param excelPath  excel的全路径
         * @param startindex excel开始读取行数 [1,]
         * @return List<String[]>  读取的excel的全部数据
         */
        public static List<String[]>  readExcelToList(String excelPath,int startindex){
           List<String[]> list = new ArrayList<String[]>();
           BufferedInputStream bis = null;
           Workbook workbook = null;
           try {
                bis = new BufferedInputStream(new FileInputStream(new File(excelPath)));
                workbook = Workbook.getWorkbook(bis);
                Sheet sheet = workbook.getSheet(1);//workbook.getSheet(0) 获得sheet1,workbook.getSheet(1) 获得sheet2
                for(int i=startindex-1;i<sheet.getRows();i++){//控制行
                    String[] strs = new String[sheet.getColumns()];//new 一个sheet.getColumns()大小的数组,用来存储此行的数据
                     for(int j=0;j<sheet.getColumns();j++){//便利列
                         Cell cell = sheet.getCell(j,i);//sheet.getCell(j,i) j:列,i:行
                         strs[j] = cell.getContents();//将此单元格的内容赋值给String[] 中
                     }
                     list.add(strs);
                }
                            
            } catch (BiffException | IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                if(bis!=null){
                    try {
                        bis.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                if(workbook!=null){
                    workbook.close();
                }
            }
            return list;
        }
        

        /**
         * excel2003 即.xls
         * @author xiangshuai
         * excel 文件读取,并将excel的行记录封装到String[]数组中,将查出来的整个行记录--即string[] 用list进行存储
         * @param excelPath  excel的全路径
         * @param startindex excel开始读取行数 [1,]
         * @return List<String[]>  读取的excel的全部数据
         */
        public static List<String[]> readExcel(String excelPath,int startindex)throws Exception{
            List<String[]> list=new ArrayList<String[]>();
            InputStream stream=new FileInputStream(new File(excelPath));
            Workbook rwb=Workbook.getWorkbook(stream);
            Sheet sheet=rwb.getSheet(0);
            for (int i = startindex-1; i < sheet.getRows(); i++) {
                String[] strs=new String[sheet.getColumns()];
                for (int j = 0; j < sheet.getColumns(); j++) {
                    Cell cell=sheet.getCell(j, i);
                    strs[j]=cell.getContents();
                }
                list.add(strs);
            }
            rwb.close();
            stream.close();
            return list;
        }
        //excel2003 即.xls 获得第一行的数据 即 描述字段头--表头 如excel中的 第1行 [年度, 目录号, 案卷号, 册序, 序号, 档号, 卷内目录, 页号, 页数]
        public static String[] readExcelHead_2003(String path) throws Exception {
            try{
                InputStream stream=new FileInputStream(new File(path));
                Workbook rwb=Workbook.getWorkbook(stream);
                Sheet sheet=rwb.getSheet(0);
                    String[] strs=new String[sheet.getColumns()];
                    for (int j = 0; j < sheet.getColumns(); j++) {
                        Cell cell=sheet.getCell(j, 0);
                        strs[j]=cell.getContents();
                    }
                rwb.close();
                stream.close();
                return strs;
            }catch (Exception e) {
                return new String[]{""};
            }
        }
        /*
         * 
         * 
         * */
        /**
         * @author liuqixiang
         * @param path
         * excel2007 即.xls 获得第一行的数据 即 描述字段头 如excel中的 第1行--表头 [年度, 目录号, 案卷号, 册序, 序号, 档号, 卷内目录, 页号, 页数],StringUtils.isNull(text):
         * 如果cell的值是 "null","Null"或无值或空字符串 均设为 ""
         * @return String[]-- excel的字段头 一般就是第一行的记录
         * @throws Exception
         */
        public static String[] readExcelHead_2007(String path) throws Exception {
            String[] strs=null;
            InputStream is=new FileInputStream(path);
            XSSFWorkbook wb;
            XSSFSheet sheet;
            XSSFRow row;
            try {
                wb=new XSSFWorkbook(is);
                sheet=wb.getSheetAt(0);
                    row=sheet.getRow(0);
                    int cum=row.getLastCellNum();
    //                int cum1=row.getPhysicalNumberOfCells();
                    strs=new String[cum];
                    for (int j = 0; j < cum; j++) {
                        XSSFCell cell=row.getCell(j);
                        
                        if(cell==null || "".equals(cell)){
                            strs[j]="";
                        }else{
                            cell.setCellType(XSSFCell.CELL_TYPE_STRING);
                            String text=cell.getStringCellValue();
                            if(StringUtils.isNull(text)){
                                text="";
                            }
                            strs[j]=text;
                        }
                        
                    }
            
                return strs;
            } catch (Exception e) {
                e.printStackTrace();
                return new String[]{""};
            }
            
        }
        /**
         * excel2003 即.xls
         * 向excel文件最后添加一行数据
         * @param excelPath excel全路径
         * @param datas 数据 --即要插入最后一行的数据
         */
        public static void addRow_last(String excelPath,String[] datas){
            try {
                InputStream is=new FileInputStream(new File(excelPath));
                Workbook wb=Workbook.getWorkbook(is);
                WritableWorkbook wbe=Workbook.createWorkbook(new File(excelPath),wb);
                WritableSheet sheet=wbe.getSheet(0);
                int rows=sheet.getRows();
                List<Label> labels=new ArrayList<Label>();
                for (int i = 0; i < datas.length; i++) {
                    Label label=new Label(i,rows,datas[i]);
                    labels.add(label);
                }
                for (int i = 0; i <labels.size(); i++) {
                    sheet.addCell(labels.get(i));
                }
                wbe.write();
                wbe.close();
                wb.close();
                is.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        /**
         * excel2003 即.xls  --- 有判断 如果excel中的cell (cell-格即具体的某一行,某一列的值) 无值,为
         * @author xiangshuai
         * excel 文件读取,并将excel的行记录封装到String[]数组中,将查出来的整个行记录--即string[] 用list进行存储 StringUtils.isNull(text):
         * 如果cell的值是 "null","Null"或无值或空字符串 均设为 ""
         * @param excelPath  excel的全路径
         * @param startindex excel开始读取行数 [1,]
         * @return List<String[]>  读取的excel的全部数据
         * StringUtils.isNull(text)
         */
        public static List<String[]> readExcel_poi2003(String excelPath,int startindex){
            List<String[]> list=new ArrayList<String[]>();
            try {
                InputStream stream=new FileInputStream(new File(excelPath));
                Workbook rwb=Workbook.getWorkbook(stream);
                Sheet sheet=rwb.getSheet(0);
                for (int i = startindex-1; i < sheet.getRows(); i++) {
                    String[] strs=new String[sheet.getColumns()];
                    for (int j = 0; j < sheet.getColumns(); j++) {
                        Cell cell=sheet.getCell(j, i);
                        if(cell==null){
                            strs[j]="";
                        }else{
                            String text=cell.getContents();
                            if(StringUtils.isNull(text)){
                                text="";
                            }
                            strs[j]=text;
                        }
                    }
                    if(strs[0]!=null&&!"".equals(strs[0])){
                        list.add(strs);
                    }
                }
                rwb.close();
                stream.close();
                return list;
            } catch (Exception e) {
                e.printStackTrace();
                return new ArrayList<String[]>();
            }
            
        }
        /**
         * @author xiangshuai
         * EXCLE 2003读取 
         * excel 文件读取 ,从startindex行开始,从第一列到第count列 的excel的行记录封装到String[]数组中,将查出来的整个行记录--即string[] 用list进行存储 StringUtils.isNull(text):
         * 如果cell的值是 "null","Null"或无值或空字符串 均设为 ""
         * @param excelPath excel路径
         * @param startindex 开始读取的行数
         * @param count 列数  ,需读取的列数
         * @return  List<String[]>  读取的excel的全部数据
         */
        public static List<String[]> readExcel_poi2003(String excelPath,int startindex,int count){
            List<String[]> list=new ArrayList<String[]>();
            try {
                InputStream stream=new FileInputStream(new File(excelPath));
                Workbook rwb=Workbook.getWorkbook(stream);
                Sheet sheet=rwb.getSheet(0);
                for (int i = startindex-1; i < sheet.getRows(); i++) {
                    String[] strs=new String[count];
                    for (int j = 0; j < count; j++) {
                        Cell cell=sheet.getCell(j, i);
                        if(cell==null){
                            strs[j]="";
                        }else{
                            String text=cell.getContents();
                            if(StringUtils.isNull(text)){
                                text="";
                            }
                            strs[j]=text;
                        }
                    }
                    if(strs[0]!=null&&!"".equals(strs[0])){
                        list.add(strs);
                    }
                }
                rwb.close();
                stream.close();
                return list;
            } catch (Exception e) {
                e.printStackTrace();
                return new ArrayList<String[]>();
            }
            
        }
        /**
         * @author xiangshuai
         * EXCLE 2007读取 
         * excel 文件读取 ,从startindex行开始,从第一列到第count列 的excel的行记录封装到String[]数组中,将查出来的整个行记录--即string[] 用list进行存储 StringUtils.isNull(text):
         * 如果cell的值是 "null","Null"或无值或空字符串 均设为 ""
         * @param excelPath excel路径
         * @param startindex 开始读取的行数
         * @param count 列数  ,需读取的列数
         * @return  List<String[]>  读取的excel的全部数据
         */
        public static List<String[]> readExcel_poi2007(String excelPath,int startindex,int count)throws Exception{
            List<String[]> list=new ArrayList<String[]>();
            InputStream is=new FileInputStream(excelPath);
            XSSFWorkbook wb;
            XSSFSheet sheet;
            XSSFRow row;
            try {
                wb=new XSSFWorkbook(is);
                sheet=wb.getSheetAt(0);
                int rowcount=sheet.getLastRowNum();
                for (int i = startindex-1; i < rowcount+1; i++) {
                    row=sheet.getRow(i);
    //                int cum=row.getLastCellNum();
    //                int cum1=row.getPhysicalNumberOfCells();
                    String[] strs=new String[count];
                    for (int j = 0; j < count; j++) {
                        XSSFCell cell=row.getCell(j);
                        if(cell==null){
                            strs[j]="";
                        }else{
                            cell.setCellType(XSSFCell.CELL_TYPE_STRING);
                            String text=cell.getStringCellValue();
                            if(StringUtils.isNull(text)){
                                text="";
                            }
                            strs[j]=text;
                        }
                    }
                    if(strs[0]!=null&&!"".equals(strs[0])){
                        list.add(strs);
                    }
                }
                return list;
            } catch (Exception e) {
                e.printStackTrace();
                return new ArrayList<String[]>();
            }
            
        }
        
        /**
         * excel2007
         * @author xiangshuai
         * excel 文件读取,并将excel的行记录封装到String[]数组中,将查出来的整个行记录--即string[] 用list进行存储 StringUtils.isNull(text):
         * 如果cell的值是 "null","Null"或无值或空字符串 均设为 ""
         * @param excelPath  excel的全路径
         * @param startindex excel开始读取行数 [1,]
         * @return List<String[]>  读取的excel的全部数据
         */
        public static List<String[]> readExcel_poi2007(String excelPath,int startindex)throws Exception{
            List<String[]> list=new ArrayList<String[]>();
            InputStream is=new FileInputStream(excelPath);
            XSSFWorkbook wb;
            XSSFSheet sheet;
            XSSFRow row;
            try {
                wb=new XSSFWorkbook(is);
                sheet=wb.getSheetAt(0);
                int rowcount=sheet.getLastRowNum();
                for (int i = startindex-1; i < rowcount+1; i++) {
                    row=sheet.getRow(i);
                    int cum=row.getLastCellNum();
    //                int cum1=row.getPhysicalNumberOfCells();
                    String[] strs=new String[cum];
                    for (int j = 0; j < cum; j++) {
                        XSSFCell cell=row.getCell(j);
                        if(cell==null){
                            strs[j]="";
                        }else{
                            cell.setCellType(XSSFCell.CELL_TYPE_STRING);
                            String text=cell.getStringCellValue();
                            if(StringUtils.isNull(text)){
                                text="";
                            }
                            strs[j]=text;
                        }
                    }
                    if(strs[0]!=null&&!"".equals(strs[0])){
                        list.add(strs);
                    }
                }
                return list;
            } catch (Exception e) {
                e.printStackTrace();
                return new ArrayList<String[]>();
            }
            
        }
        /**
         * 向excel中插入图片
         * @param excelPath
         * @param imagePath
         * @param x 
         * @param y
         * @param width
         * @param height
         */
        public static void insertImg(String excelPath,String imagePath,int x,int y,int width,int height){
            try{
                InputStream is=new FileInputStream(new File(excelPath));
                Workbook wb=Workbook.getWorkbook(is);
                WritableWorkbook wbe=Workbook.createWorkbook(new File(excelPath),wb);
                WritableSheet sheet=wbe.getSheet(0);
                File imgFile=new File(imagePath);
                WritableImage image=new WritableImage(x,y,width,height,imgFile);
                sheet.addImage(image);
                wbe.write();
                wbe.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        
        
        /**
         * 判断字符串是否为空 为空返回true
         * @param str
         * @return
         */
        public static boolean isNull(String str){
            if(str==null||"null".equals(str)||"NULL".equals(str)){
                return true;
            }else{
                str=str.replaceAll(" ", "");
                if("".equals(str)){
                    return true;
                }else{
                    return false;
                }
            }
        }


        
        public static void main(String[] args) {
            /*try {
                readExcel_poi2007("E:\\szhgj\\2009-XCH\\诉讼档案盒(1).xls",2);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }*/
            try {
                createExcel("E:/temp");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
                
        }
        
        
        //xiangshuai======================================================== excel导出操作

        /** 
         * 表头单元格样式的设定 
         */  
        public static WritableCellFormat getHeaderCellStyle()throws Exception{  
              
            /* 
             * WritableFont.createFont("宋体"):设置字体为宋体 
             * 10:设置字体大小 
             * WritableFont.BOLD:设置字体加粗(BOLD:加粗     NO_BOLD:不加粗) 
             * false:设置非斜体 
             * UnderlineStyle.NO_UNDERLINE:没有下划线 
             */  
            WritableFont font = new WritableFont(WritableFont.createFont("宋体"),12,WritableFont.NO_BOLD,false, UnderlineStyle.NO_UNDERLINE);           
            WritableCellFormat headerFormat = new WritableCellFormat(NumberFormats.TEXT);  
            try {  
                //添加字体设置   
                headerFormat.setFont(font);  
                //设置单元格背景色:表头为黄色   
                headerFormat.setBackground(Colour.WHITE);  
                //设置表头表格边框样式   
                //整个表格线为粗线、黑色   
                headerFormat.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK); 
                //表头内容水平居中显示   
                headerFormat.setAlignment(Alignment.CENTRE);   
    //            headerFormat.setAlignment(jxl.format.Alignment.CENTRE);//把水平对齐方式指定为居中
    //            headerFormat.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);//把垂直对齐方式指定为居中
    //            headerFormat.setWrap(true);//设置自动换行        
            } catch (WriteException e) {  
                e.printStackTrace();
            }  
            return headerFormat;  
        }  
        /** 
         * 表头单元格样式的设定 
         */  
        public static WritableCellFormat getBodyCellStyle()throws Exception{  
              
            /* 
             * WritableFont.createFont("宋体"):设置字体为宋体 
             * 10:设置字体大小 
             * WritableFont.NO_BOLD:设置字体非加粗(BOLD:加粗     NO_BOLD:不加粗) 
             * false:设置非斜体 
             * UnderlineStyle.NO_UNDERLINE:没有下划线 
             */  
            WritableFont font = new WritableFont(WritableFont.createFont("宋体"), 12, WritableFont.NO_BOLD, false,  UnderlineStyle.NO_UNDERLINE);  
              
            WritableCellFormat bodyFormat = new WritableCellFormat(font);  
            try {  
                //设置单元格背景色:表体为白色   
                bodyFormat.setBackground(Colour.WHITE);  
                //设置表头表格边框样式   
                //整个表格线为细线、黑色   
                bodyFormat.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);  
                  
            } catch (WriteException e) {  
                e.printStackTrace();
            }  
            return bodyFormat;  
        }
        
        public static boolean  createExcel(String excelPreDir) throws Exception{
            String excelFilePath=excelPreDir+File.separator+"cxExport.xls";
            //创建一个excel文件
             WritableWorkbook book = Workbook.createWorkbook(new File(excelFilePath));
            //创建一个工作薄,参数1:名称,参数2:位置(0:第一页,1:第二页 ....)
             WritableSheet sheet = book.createSheet("测试EXCEL-DEMO", 0);
            //去掉整个sheet中的网格线
             //sheet.getSettings().setShowGridLines(false);
             //添加excel表头  sheet.setColumnView(arg0, arg1) arg0:列(如0表示第一列) arg2:代表此单元格-cell的宽度
             for(int j=0;j<8;j++){ //列
                 sheet.setColumnView(j, j*5+1);
                 /*xl.write.Label.Label(int c, int r, String cont, CellFormat st) 在第r行第c列 创建一个内容是 cont 样式为st 的文本单元格
                  * c: 列   r:行 ,cont:内容 st:样式
                 */
                 
                 
                 Label label = new Label(j,0,"内容 "+j,getHeaderCellStyle());                                                                                                                                                                        
                 sheet.addCell(label);        
             }
             for(int i=0;i<5;i++){//行
                 for(int j=0;j<8;j++){ //列
                     
                 }
             }
             book.write();//将sheet内容写入excel--否则excel会没有内容的
             book.close();//不关闭会报错 ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
            return false;
        }
        
    }
     

    展开全文
  • C语言操作EXCEL文件(读写)

    万次阅读 多人点赞 2019-06-04 09:02:55
    在之前需要使用C语言读取Excel文件内容的功能,查阅了很多资料,大部分是通过ODBC或者过OLE/COM对Excel表格的读取操作,这变要求在工程中添加类,如CApplicaton及其头文件等,这包括Excel接口、导入类、头文件等。...

    C语言操作EXCEL文件(读写)

    本文主要介绍通过纯C语言进行EXCEL的读写操作:(修改时间2018.08.28,如果运行结果均是0,请看文章最后一节)

    • C语言读操作
    • C语言写操作

    在之前需要使用C语言读取Excel文件内容的功能,查阅了很多资料,大部分是通过ODBC或者过OLE/COM对Excel表格的读取操作,这变要求在工程中添加类,如CApplicaton及其头文件等,这包括Excel接口、导入类、头文件等。操作十分复杂,当然我也对这种方法进行了尝试,也实现了功能,这种方法实现的功能比较多,一般我们只是进行简单的读写操作,所以并不是很想使用这种方法。下面通过C语言读写程序来实现。

    一、写操作

    第一步:单纯C语言写入Excel文件只能是 *.csv的后缀文件(是和txt一样,以二进制文本形式存储,它是以都逗号分隔符做个单元格内容的划分, .xls存储比较复杂, .csv文件可以可以通过.xls或者.xlsx文件另存为,选择.csv文件格式),它们可以通过Notepad++等记事本软件当做txt文件打开。

    需要注意的是:当对*.xls文件写入或者读取之后,再打开Excel文件时会弹出格式兼容的提示窗口,因为这样的C语言操作Excel文件是当文本文件打开操作的,所以会忽略原有格式,但是不影响,点击“是(Y)”即可,如下图所示:

    格式兼容性提示

    第二步:对表格的处理,使用C语言打开表格后,文件指针指向整个表格的第1行第1列。
    如果要给它的下一个同行单元格(第1行第2列)写数据,使用"\t" ;
    如果要给它的下一个同列单元格(第2行第1列)写数据,使用"\n" 。

    具体代码如下:

    void writeExcel()
    {
    	char chy[4]={ 'x' ,'a' ,'h','w' } ;
    	int data[4]={ 1 , 3 , 6 ,9	};
    	int i ;
    	FILE *fp = NULL ;
    	fp = fopen("G:\\Desktop\\test.csv","w") ;
    	for (i=0 ; i<4 ;i++)
    		fprintf(fp,"%c\t%d\n",chy[i],data[i] ) ;
    	fclose(fp);
    }
    void main()
    {					
    	writeExcel()  ;	
    }
    

    运行结果

    写入文件
    写入文件

    二、读操作

    读取文件

    打开文件
    读取文件内容

    对于读取Excel文件的操作,使用了文件随机定位函数fseek(),它的一般调用格式如下:
    fseek(文件指针,位移量,起始位置) ;
    **fseek()**参数说明:
    位移量
    : 指重新定位时的字节偏移数,表示相对于基址的字符数,通常是一个长整型数,可以是整形常量,整形表达式等。如果用整型常量,需要再后面加上字母“L”;如果使用整形表达式需要用“(long)(表达式)”强制转换成长整形。

    起始位置
    指重新定位时的基准点,也就是基址,用整数或符合常量表示。如下表:
    整数 符号常量 对应的起始位置
    0 SEEK_SET 文件开头
    1 SEEK_CUR 文件指针的当前位置
    2 SEEK_END 文件末尾

    例如:
    fseek(fp , 10L , 0) ;

    具体代码如下:

    #include <stdio.h>
    void main()
    {	
    	FILE *fp;
    	char filename[40]  ;
    	int i,j ;
        float da[6][5] = {0} ;
        printf(" 输入文件名: ");
        gets(filename);
        fp=fopen(filename,"r");     // fp指针指向文件头部
        for(i = 0 ;i < 6 ; i++)
            for(j = 0 ;j < 5 ; j++)
            {
    			fscanf(fp,"%f",&da[i][j]);
    			fseek(fp, 5L, SEEK_CUR);   /*fp指针从当前位置向后移动*/
    		}
               
        for(i = 0 ;i < 6 ; i++)
            printf("%f\t%f\t%f\t%f\t%f\t\n",da[i][0],
             da[i][1],da[i][2],da[i][3],da[i][4]);
    }
    

    运行结果

    运行结果


    十分抱歉,由于个人疏忽,代码给大家带来麻烦,再次表示抱歉。以上读Excel文件的错误已经解决,代码已经更新,错误的产生是由于fseek( )函数放错了位置,以及其中第二个参数的偏移量的错误,若大家在以后学习中发现读取数据全为0或者读取数据顺序位置不正确,请查阅fseek( )函数的参数使用方法。

    另外,上述开发是在CodeBlocks中进行的,如果使用Visual Stdio 2010等版本软件,出现闪退问题,是软件自身bug所致,在main( )函数结尾添加"system(“pause”); 或者getchar( ); " 即可解决,对应的VS2010读Excel实例如下:


    例程:
    这里写图片描述

    读该Excel文件代码如下:

    #include <stdio.h>
    void main()
    {   
        FILE *fp;
        char filename[40]  ;
        int i,j ;
        float da[6][5] = {0} ;
        printf(" 输入文件名: ");
        gets(filename);
        fp=fopen("as.csv","r");
        fseek(fp, 5L, SEEK_SET);   // 从文件第二行开始读取
        for(i = 0 ;i < 6 ; i++)
            for(j = 0 ;j < 5 ; j++)
    		{
    			fscanf(fp,"%f",&da[i][j]);
    			fseek(fp, 1L, SEEK_CUR);   /*fp指针从当前位置向后移动*/
    		}
               
    	for(i = 0 ;i < 6 ; i++)
            printf("%f\t%f\t%f\t%f\t%f\t\n",da[i][0],
             da[i][1],da[i][2],da[i][3],da[i][4]);
    
    	getchar() ;
    }
    

    VS2010工程如下:
    这里写图片描述

    运行结果:
    这里写图片描述

    三、最新补充 2018.08.28


    由于经常有朋友告诉我运行结果是0 ,并将他们的工程发到我邮箱,我试着运行了下,确实发现是0.0 ,程序没有报错。
    然后,我试着将他们发给我的工程里的excel文件或者csv文件打开,发现会弹出提示文件损坏,如果我点击“是”的话,文件同样可以继续打开,这可能是文件格式损坏了,所以程序计算不了数据的位置。我简单的将他们的excel文件重新另存为了一个excel,便运行成功了。他们的excel问题如下图。
    Excel损坏
    损坏后还可以打开:
    损坏

    谢谢! 有问题可以,一起讨论下,不过希望自己能够一步从简到繁的进行调试也是一种学习,希望不用直接把代码扔过来让给修改。

    展开全文
  • java读写excel

    千次阅读 2019-05-07 18:36:54
    读取excel的时候,把每行数据看做一个一纬数组oneData对象,然后把这一个一个的一维数组遍历封装成一个二维数组的allData对象,写入excel的时候与此相反,把这个二维数组对象拆分成一个一个的...

    平常工作中,会有大量数据需要写入数据库,如果一个个逐条手动录入,很容易出现意想不到的差池,这时就需要excel直接导入了,方便快捷并且也不容易出错。那么,如何实现excel读取和写入呢?

    思路

    读取excel的时候,把每行数据看做一个一纬数组oneData对象,然后把这一个一个的一维数组遍历封装成一个二维数组的allData对象,写入excel的时候与此相反,把这个二维数组对象拆分成一个一个的一维数组,再把这些一维数组逐次写入excel中。

    需要jar包如下:

    jxl.jar

    poi-3.15.jar

    poi-examples-3.8.jar

    poi-excelant-3.9.jar

    poi-ooxml-4.0.0.jar

    poi-scratchpad-4.0.0.jar

    另需一份test.xls文件,可以随意填充一些数据。

    所需要的jar包和测试文件,可在此下载:

    链接:https://pan.baidu.com/s/13BQGcD1xMb8a6OuBIzDsMQ 
    提取码:he2j 

    代码实现如下

    package jichu.excel_r;
    
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    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.Cell;
    import jxl.Sheet;
    import jxl.Workbook;
    
    
    public class QueryExcel {
    
        public static void main(String[] args) {
    
            // 读取Excel文件
            File file = new File("E:/allData.xls");
            try {
                //得到所有数据
                List<List<String>> allData = readExcel(file);   //格式:[  [1],[2],[3] ]
                //直接将它写到excel中
                List<List<String>> result = dealData(allData); //格式:[  [1],[2],[3],[1],[2],[3],[1],[2],[3] ]
                makeExcel(result);
    
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
        /**
         * 获取数据
         * @param file
         * @return
         * @throws Exception
         */
        private static List<List<String>> readExcel(File file) throws Exception {
    
            // 创建输入流,读取Excel
            InputStream is = new FileInputStream(file.getAbsolutePath());
            // jxl提供的Workbook类
            Workbook wb = Workbook.getWorkbook(is);
            // 只有一个sheet,直接处理
            //创建一个Sheet对象
            Sheet sheet = wb.getSheet(0);
            // 得到所有的行数
            int rows = sheet.getRows();
            // 所有的数据
            List<List<String>> allData = new ArrayList<List<String>>();
            // 越过第一行 它是列名称
            for (int j = 1; j < rows; j++) {
    
                List<String> oneData = new ArrayList<String>();
                // 得到每一行的单元格的数据
                Cell[] cells = sheet.getRow(j);
                for (int k = 0; k < cells.length; k++) {
    
                    oneData.add(cells[k].getContents().trim());
                }
                // 存储每一条数据
                allData.add(oneData);
                // 打印出每一条数据
                //System.out.println(oneData);
    
            }
            return allData;
    
        }
        /**
         * 处理数据
         */
        public static  List<List<String>> dealData(List<List<String>> allData) {
    
            //结果
            List<List<String>> result=new ArrayList<List<String>>();
    
            for(int i=0;i<allData.size();i++) {
    
                List<String> oneDatai=allData.get(i);
                for(int j=0;j<allData.size();j++) {
                    List<String> oneDataj=allData.get(j);
                   // System.out.println(oneDataj);
                    result.add(oneDataj);
    
                }
            }
            return result;
        }
    
        /**
         * 将数据写入到excel中
         */
        public static  void makeExcel(List<List<String>> result) {
    
            //第一步,创建一个workbook对应一个excel文件
            HSSFWorkbook workbook = new HSSFWorkbook();
            //第二部,在workbook中创建一个sheet对应excel中的sheet
            HSSFSheet sheet = workbook.createSheet("病例日期表");
            //第三部,在sheet表中添加表头第0行,老版本的poi对sheet的行列有限制
            HSSFRow row = sheet.createRow(0);
            //第四步,创建单元格,设置表头
            HSSFCell cell = row.createCell(0);
            cell.setCellValue("date");
            cell = row.createCell(1);
            cell.setCellValue("month");
            cell = row.createCell(2);
            cell.setCellValue("weekday");
            cell = row.createCell(3);
            cell.setCellValue("毫升/单位");
            //第五步,写入数据
            for(int i=0;i<result.size();i++) {
    
                List<String> oneData = result.get(i);
                HSSFRow row1 = sheet.createRow(i + 1);
                for(int j=0;j<oneData.size();j++) {
    
                    //创建单元格设值
                    row1.createCell(j).setCellValue(oneData.get(j));
                }
            }
    
            //将文件保存到指定的位置
            try {
                FileOutputStream fos = new FileOutputStream("E:\\result.xls");
                workbook.write(fos);
                System.out.println("写入成功");
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
    }

    说明:

    1. 在运行之前需要把需要读取的excel文件放到自定义的目录,我的把读取文件放在了 E:/allData.xls,把写入的文件也放在了E盘并命名为result.xls
    2. 在116行--122行我只定义了3个列名,你可根据需要再多定义几个列名。

    参考:https://blog.csdn.net/wu2374633583/article/details/80546449

    展开全文
  • vs对Excel读写操作

    千次阅读 2018-10-05 11:39:13
    这些天做个软件,需要读取 Excel 并导入到数据库中,所以研究了一下在 VC 下操作 Excel 的方法,这里做个总结,以作备忘。   一、最常用的 OLE 自动化方式 这个方式应该说是功能最全的方式,可能也是应用的最多...
  • excel文件读写excel文件读写excel文件读写
  • C#读写Excel的几种方法

    万次阅读 2019-04-30 17:07:34
    1 使用Office自带的库 前提是本机须安装office才能运行,且不同的office版本之间可能会有兼容问题,从...读写代码如下: using Microsoft.Office.Interop.Excel; using Excel = Microsoft.Office.Interop.Excel; p...
  • C#读写Excel文件(一)

    万次阅读 2018-11-29 20:39:41
    1、加入相应的COM组件 在Winform程序中对Word进行操作需要引入相关的COM... 在对应的CS文件中使用其名字空间, ...using System.Reflection;...using MSWord=Microsoft.Office.Interop. Excel using Microsoft.Off...
  • 1.方法一:采用OleDB读取EXCEL文件:  把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下:  1 2 3 4 5 6 7 8 9 10 11 12 13 14 public...
  • 使用pandas读写Excel文件

    万次阅读 2017-01-16 20:30:31
    使用pandas读写Excel文件: 模块安装: pip install openpyxl 模块openpyxl源于PHPExcel,它提供了针对.xlsx文件的读写功能 pip install xlsxwriter 模块也需要读取.xlsx文件 pip install xlrd 模块xlrd...
  • C++读写EXCEL文件方式比较

    万次阅读 多人点赞 2015-01-19 02:40:48
    因为有些朋友问代码的...C++读取Excel的XLS文件的方法有很多,但是也许就是因为方法太多,大家在选择的时候会很疑惑。 由于前两天要做导表工具,比较了常用的方法,总结一下写个短文,   1.OLE的方式 这个大约是最常
  • JAVA基于jxl包读写Excel文件(一)

    万次阅读 2018-09-10 20:10:58
    由于工作需要又想练一下编程,用java读写了一个excel数据文件测试读取功能。数据文件大概是这样,为了读取方便我把表头去掉了。一共三列数据,第一列是L值,第二列是B值,是空间物理的LB坐标,第三列是粒子通量值。 ...
  • VBS 读取excel内容并写入到文本文件

    万次阅读 2014-04-14 11:02:17
    使用VBS读取excel内容并写入到文本中
  • Aspose.Cells.dll 读写Excel的用法总结-技术&分享 读ExcelExcel
  • java读写Excel三种常用的技术

    千次阅读 2015-04-19 20:14:48
    读写Excel三种常用的技术 1.POI 2.JXL 3.FASTEXCEL POI Apache POI是Apache软件基金会的开放源代码函数库,POI提供API给java程序对Microsoft Office格式档案读和写的功能。HSSF是Horrible SpreadSheet ...
  • C++ 读写Excel(LibXL库使用详解)

    千次阅读 2019-07-03 10:24:07
    https://blog.csdn.net/zt_xcyk/article/details/72846042
  • nodejs读写excel内容

    万次阅读 2016-09-05 14:33:04
    支持读写Excel的node.js模块 node-xlsx: 基于Node.js解析excel文件数据及生成excel文件,仅支持xlsx格式文件; excel-parser: 基于Node.js解析excel文件数据,支持xls及xlsx格式文件; excel-export : 基于Node....
  • 使用python读写操作同一个...最近开始学习python,想做做简单的自动化测试,需要读写excel,然后就找到了xlrd来读取Excel文件,使用xlwt来生成Excel文件(可以控制Excel中单元格的格式),需要注意的是,用xlrd读取exc
  • C++ 之 Excel文件读写 之 简便方法

    万次阅读 多人点赞 2015-11-13 15:06:36
    excel 文件的简单读写方法
  • C# 使用 NPOI 库读写 Excel 文件

    千次阅读 2019-01-08 10:38:10
    第一步添加程引用 : 右键项目工程 — 管理 NuGet程序包 — 搜索 NOPI — 安装 ...读取excel文件 private IWorkbook wk; private FileStream fs; private void OpenExcel(string path) { ...
1 2 3 4 5 ... 20
收藏数 118,039
精华内容 47,215
关键字:

读写excel