用C 读取EXCEL表格内容是一件很麻烦的事,我们需

作者: 编程  发布:2019-08-28

用C 读取EXCEL表格内容是一件很麻烦的事,今天看了《把脉VC 》里面提到了用CStringArray读取EXCEL表格内容,确实不错。 主要是先将EXCEL转存成CSV格式这种格式经常用来作为不同程序之间数据交互的格式)。 然后用C 程序读取CSV。 主要包括两个类: class CRow
{
private:
 CStringArray * _row;
public:
 CRow(CStringArray * row);
 int getColumnCount(void);
 CString getColumn(int i);
};
class CSheet
{
private:
 CTypedPtrArray<CPtrArray, CStringArray *> _rows;
public:
 CSheet(void);
 ~CSheet(void);
 int loadFrom(ifstream & in);
 int getRowCount(void);
 CRow getRow(int i);
}; 具体方法参照《把脉VC 》 demo: int main()
{
 CSheet sheet;  //打开csv文件
 ifstream in("test.csv");
 //加载至CSheet
 sheet.loadFrom(in);  //打开转存到的目标文件txt
 ofstream out("test.txt");  char* sTmp = new char[100];  for(int i = 0; i < sheet.getRowCount(); i )
 {
  _tprintf(_T("[d] "), i);
  //获取指定行
  CRow row = sheet.getRow(i);
  for(int j = 0; j < row.getColumnCount(); j )
  {
   //获取指定列
   CString s = row.getColumn(j);
   _tprintf(_T("%s "), s);      //把CString 类型转成char*类型
   sprintf(sPane,_T("%s "),s);
   //保存在TXT文件中
   //cout<<"n"<<sTmp<<endl;
   out<<sPane<<"t";
  }
  _tprintf(_T("rn"), i);
  out<<"n";
 }
   out.close();
   in.close();
 return 0;
}   附:来自 CStringArray类成员

Java 操作 EXCEL,java操作excel

  今天帮朋友写了一段用来处理EXCEL内容的程序,在这里记录下自己的学习过程。主要是对EXCEL表格中的内容做分类和统计,使用计算机来做这种重复的机械性地工作再好不过了。首先,我们需要下载一个java操作excel的开源插件,我使用的是jexcelapi(下载链接: Build Path 里面添加jxl.jar文件。至此,开发环境搭建完成。下面展开具体的操作:

  1、定义数据类型,因为每一列的数据类型不同,这里采用类数据类型来存储,采用对象数组来存储每一行的内容。

图片 1class record{ private int num; private char ty; public void SetNum(String s1){ this.num=Integer.parseInt(s1); } public void SetTy(String s2){ this.ty=(char)s2.getBytes()[0]; } public int GetNum(){ return num; } public char GetTy(){ return ty; } } record a[] = new record[row]; for(int i=0;i<row;i ) a[i]= new record(); View Code

  注意代码中对对象数组的每一个元素初始化的过程,否则会出现java.lang.NullPointerException的异常抛出。

  2、连接到EXCEL,获取工作空间,我们用到了Workbook和Sheet类,在之前导入的jxl包里面。

图片 2//创建一个读取excel的容器 Workbook book = Workbook.getWorkbook(new File("G:/test123.xls")); //读取第一页 Sheet sheet = book.getSheet(0); //读取电子表格和列数和行数 int col = sheet.getColumns(); int row = sheet.getRows(); View Code

  3、读取每一个单元格的内容。将单元格的数据读取到数组中之后,接下来的工作可根据具体情况完成实际操作。

图片 3for(int i=0;i<row;i ){ //第一个参数代表列,第二个参数代表行 Cell cell1=sheet.getCell(0, i); Cell cell2=sheet.getCell(1, i); a[i].set_num(cell1.getContents()); a[i].set_ty(cell2.getContents()); } View Code

  4、根据需求完成相关操作后,需要将数据写会Excel表格中,我们用到了WritableWorkbook和WritableSheet两个类。

图片 4//创建一个可写excel文件 WritableWorkbook bookw = Workbook.createWorkbook(new File("G:/testwtb.xls")); //写入excel的第一页 WritableSheet sheetw = bookw.createSheet("first sheet",0); for(int i=0;i<=index;i ){ Number n = new Number(0,i,x[i]); sheetw.addCell(n); Number n1 = new Number(1,i,y[i]); sheetw.addCell(n1); Number n2 = new Number(2,i,z[i]); sheetw.addCell(n2); Number n3 = new Number(3,i,xx[i]); sheetw.addCell(n3); } bookw.write(); bookw.close(); View Code

至此,所有操作完成。

操作 EXCEL,java操作excel 今天帮朋友写了一段用来处理EXCEL内容的程序,在这里记录下自己的学习过程。主要是对EXCEL表格中的内容做分类...

package cn.jiguang.base64;

public class CopyExcelSheetToAnotherExcelSheet {

构造

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

  public static void main(String[] args) throws FileNotFoundException, IOException {
    String fromPath = "D:\share\jiemu_new\";// excel存放路径
    String toPath = "c:\ok\";// 保存新EXCEL路径
    // 新的excel 文件名
    String excelName = "节目访问量";
    // 创建新的excel
    HSSFWorkbook wbCreat = new HSSFWorkbook();
    File file = new File(fromPath);
    for (File excel : file.listFiles()) {
      // 打开已有的excel
      String strExcelPath = fromPath "\" excel.getName();
      InputStream in = new FileInputStream(strExcelPath);
      HSSFWorkbook wb = new HSSFWorkbook(in);
      for (int ii = 0; ii < wb.getNumberOfSheets(); ii ) {
        HSSFSheet sheet = wb.getSheetAt(ii);
        HSSFSheet sheetCreat = wbCreat.createSheet(sheet.getSheetName());
        // 复制源表中的合并单元格
        MergerRegion(sheetCreat, sheet);
        int firstRow = sheet.getFirstRowNum();
        int lastRow = sheet.getLastRowNum();
        for (int i = firstRow; i <= lastRow; i ) {
          // 创建新建excel Sheet的行
          HSSFRow rowCreat = sheetCreat.createRow(i);
          // 取得源有excel Sheet的行
          HSSFRow row = sheet.getRow(i);
          // 单元格式样
          int firstCell = row.getFirstCellNum();
          int lastCell = row.getLastCellNum();
          for (int j = firstCell; j < lastCell; j ) {
            // 自动适应列宽 貌似不起作用
            //sheetCreat.autoSizeColumn(j);
            System.out.println(row.getCell(j));
            rowCreat.createCell(j);
            String strVal ="";
            if (row.getCell(j)==null) {
             
            }else{
              strVal = removeInternalBlank(row.getCell(j).getStringCellValue());
            }
            rowCreat.getCell(j).setCellValue(strVal);
          }
        }
      }
    }
    FileOutputStream fileOut = new FileOutputStream(toPath excelName

CStringArray 构造一个空的CString对象数组

import jxl.Cell;
import jxl.CellType;
import jxl.NumberCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

  • ".xls");
        wbCreat.write(fileOut);
        fileOut.close();
      }

绑定

/**
 * 
 * @Description: Excel自动导出txt,构建java代码
 * @Author: zengxiaochi
 *
 * @Date: 下午11:37:27
 */
public class ExcelExport {

  /**
  * 复制原有sheet的合并单元格到新创建的sheet
  *
  * @param sheetCreat
  *      新创建sheet
  * @param sheet
  *      原有的sheet
  */
  private static void MergerRegion(HSSFSheet sheetCreat, HSSFSheet sheet) {
    int sheetMergerCount = sheet.getNumMergedRegions();
    for (int i = 0; i < sheetMergerCount; i ) {
      Region mergedRegionAt = sheet.getMergedRegionAt(i);
      sheetCreat.addMergedRegion(mergedRegionAt);
    }

GetSize 获取这个数组中的元素数目
SetSize 设置这个数组中包含的元素数目
GetUpperBound 返回最大的有效索引

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String filepath = "sjd_pdl.xls";

  }

操作符

        excelOutTxt(filepath);
    }

  /**
  * 去除字符串内部空格
  */
  public static String removeInternalBlank(String s) {
    // System.out.println("bb:" s);
    Pattern p = Pattern.compile("\s*|t|r|n");
    Matcher m = p.matcher(s);
    char str[] = s.toCharArray();
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < str.length; i ) {
      if (str[i] == ' ') {
        sb.append(' ');
      } else {
        break;
      }
    }
    String after = m.replaceAll("");
    return sb.toString() after;
  }
}

FreeExtra 释放当前数组边界之外的未使用的所有内存
RemoveAll 从数组中删除所有元素

    private static void excelOutTxt(String filepath) {
        try {
            Workbook workbook = Workbook.getWorkbook(new File(filepath));
            Sheet sheet = workbook.getSheet("配置表");
            Sheet sheet2 = workbook.getSheet("模型逻辑");
            // rows为行数,columns列数,getCell("列号","行号")
            int rows = sheet2.getRows();
            int columns = sheet2.getColumns();
            Cell c2 = null;
            NumberCell numberCellOne = null;
            List<String> strList = new ArrayList<String>();
            List<Object> doubleList = new ArrayList<Object>();

元素访问

            // 用来记录要比较的字符串

GetAt 返回位于给定索引处的值
SetAt 设置给定索引处的元素的值;不得将数组增大
ElementAt 返回对数组中的某一元素指针的临时引用
GetData 对数组中的元素允许的访问。可以是NULL

            List<String> storage = new ArrayList<String>();
            for (int i2 = 0; i2 < rows; i2 ) {
                for (int j2 = 0; j2 < columns; j2 ) {
                    // 根据横纵轴获取单元格数据
                    c2 = sheet2.getCell(j2, i2);
                    if (c2.getColumn() == 0) {
                        strList.add(c2.getContents());
                    } else if (c2.getColumn() == 1) {
                        if (CellType.NUMBER == c2.getType()) {
                            numberCellOne = (NumberCell) c2;
                            doubleList.add(numberCellOne.getValue());
                        } else {
                            doubleList.add(c2.getContents());
                        }
                    }

扩大数组

                }
            }
            for (Object object : doubleList) {
                System.out.println(object);
            }
            System.out.println("==============");
            for (String str : strList) {
                System.out.println(str);
            }

SetAtGrow 设置给定索引处的值,如果必要的话可以增长数组
Add 在数组的末尾添加一个元素;可根据需要增长数组
Append 向数组中添加另一个数组;如果必要的话可增长数组
Copy 将另一个数组拷贝到此数组中;如果必要的话可增长数组

            File fileSuccess = new File("success.txt");
            FileWriter fwSuccess = new FileWriter(fileSuccess);
            BufferedWriter bwSuccess = new BufferedWriter(fwSuccess);

插入/删除

            // j为行数,getCell("列号","行号")
            int j = sheet.getRows();
            int y = sheet.getColumns();
            Cell c = null;
            NumberCell numberCell = null;           

InsertAt 在指定索引处插入一个元素或者是另一个数组中的所有元素)
RemoveAt 删除指定索引处的一个元素

            for (int i = 0; i < j; i ) {
                StringBuffer stringBuffer = new StringBuffer();
                for (int x = 0; x < y; x ) {
                    c = sheet.getCell(x, i);
                    if (CellType.NUMBER == c.getType()) {
                        numberCell = (NumberCell) c;
                    }

操作符

                    if (c.getColumn() == 0) {
                        storage.add(c.getContents());
                        stringBuffer.append("antifraudSjdModelEntityList.add(new AntifraudSjdModelEntity( " '"'
                                 c.getContents() '"');
                    } else if (c.getColumn() == 1 || c.getColumn() == 2) {
                        continue;
                    } else if ("inf".equals(c.getContents())) {
                        stringBuffer.append(", " "Double.MAX_VALUE");
                    } else if ("-inf".equals(c.getContents())) {
                        stringBuffer.append(", " "-Double.MAX_VALUE");
                    } else if (c.getColumn() == 5) {
                        if (CellType.NUMBER == c.getType()) {
                            stringBuffer.append(", " numberCell.getValue());
                        } else {
                            stringBuffer.append(", " c.getContents());
                        }
                    } else if (c.getColumn() == 6) {
                        for (int k = 0; k < strList.size(); k ) {
                            if (storage.get(0).trim().equals(strList.get(k).trim())) {
                                stringBuffer.append(", " doubleList.get(k) "));");
                            }
                        }
                        storage.remove(0);
                    } else if ("".equals(c.getContents())) {
                        stringBuffer.append(", " "null");
                    } else {
                        if (CellType.NUMBER == c.getType()) {
                            stringBuffer.append(", " numberCell.getValue());
                        } else {
                            stringBuffer.append(", " c.getContents());
                        }
                    }
                }

operator [] 设置或获取在指定索引处的元素

                bwSuccess.write(stringBuffer.toString());
                bwSuccess.write(" ");
                bwSuccess.flush();
                // 读取一行后换行
                bwSuccess.newLine();
                // 刷新
            }
            System.out.println("写入结束");
        } catch (BiffException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}  

站长统计图片 5

本文出自 “ClickFuture” 博客,请务必保留此出处

CStringArray 读取EXCEL表格内容,确实不错。主要是先将EXCEL转存...

本文由9159.com发布于编程,转载请注明出处:用C 读取EXCEL表格内容是一件很麻烦的事,我们需

关键词: 9159.com