将oracle数据库中数据写入excel文件

转载 2015年11月20日 13:44:54

主要实现思路:
    1、声明一个纪录,用来存储导出的数据;
    2、使用游标取数据到纪录中;
    3、使用utl_file将纪录中的数据写入excel文件;
    4、循环执行步骤2和3,完成数据的导出。
    做的过程中主要遇到的问题:
    1、excle文件中写数据如何写入下一列;
          使用TAB字符完成excel中横向跳格,excel中TAB字符表示单元格的结尾,其中使用了chr()函数,
应用举例如下:
         select U.USER_NAME||chr(9),U.ACCOUNT||chr(9) from USER U
                                            例句1
          例句1作为游标的主体,取出的数据每项都包含一个TAB字符,使用utl_file.put()往excel文件中
写数据时会自动跳格
    2、声明的纪录中各项的类型问题
           这个问题的产生主要是在类型的强转化时产生。如例句1种的U.ACCOUNT为number型时,
添加||chr(9)时oracle会对进行强转化;当然这里的转化不会有问题(number转化为varchar2),
但是当这种强转换还是会出现问题的,如声明的纪录里某个属性声明为用户自己定义的一种类型,
oracle无法进行转换,则会报错。解决的办法很简单,可以将纪录的属性都声明为varchar类型,但是要注意长度。
    3、导出文件存储路径问题
       utl_file在写文件时,文件的存储路径必须在oracle初始化参数utl_file_dir中设置,
需重起服务才能生效。后来经过查资料发现可以先建立一个directory,在存储过程中使用它。
建立directory的语句:
create or replace directory FILEPATH as 'path' ";
例句2(注:path为存储文件的路径,如c:\Temp)

    以下是我简单做的处理hr.jobs表数据的存储过程:
      
CREATE OR REPLACE PROCEDURE SP_JOBS_DATA_OUT(
      p_file_name IN VARCHAR2           --***处理文件名称,需包含扩展名(xls用于写excel文件)***--
      ) as
     
   --***定义并声明存储交通资产信息的纪录***--
   --***record_define start***--
    TYPE job_record_type is RECORD(
    job_id hr.jobs.job_id%TYPE,
    job_title hr.jobs.job_title%TYPE,
    min_salary varchar2(30)
    );
    job_rec job_record_type;
   --***record_define end***--
  
  
    --***定义获取job信息的游标***--
   --***cursor_define start***--
    CURSOR c_jobs IS
     select
        job_id||chr(9),      --***chr(9)是TAB字符,保证数据输出到EXCEL时能自动换到下一列***--
        job_title||chr(9),
        min_salary||chr(9)
    FROM
        hr.jobs;
   --***cursor_define end***--
   
    l_file utl_file.file_type;      --***处理文件操作的句柄***--
 
   
BEGIN
     l_file :=utl_file.fopen('FILEPATH',p_file_name,'w');    --FILEPATH是先于导出前用户建立的存储导出文件的路径
     utl_file.put_line(l_file,'jobs表导出数据');
  
   OPEN c_jobs;
     LOOP 
     FETCH  c_jobs INTO   
            job_rec.job_id  ,
            job_rec.job_title ,
            job_rec.min_salary ;
         EXIT WHEN c_jobs%NOTFOUND;
            utl_file.put(l_file,job_rec.job_id );            --***数据写入excle文件中***--
            utl_file.put(l_file,job_rec.job_title);
            utl_file.put_line(l_file,job_rec.min_salary);
               
     END LOOP;
   CLOSE  c_jobs;
     utl_file.fflush(l_file);
     utl_file.fclose(l_file);
  
   EXCEPTION
     WHEN others THEN
      IF utl_file.is_open(l_file) THEN
         utl_file.fclose(l_file);
       
      END IF;
END;
例句3(注:我的oracle版本为9.2)


DECLARE
        FILE_ID TEXT_IO.FILE_TYPE;
        FILE_NAME VARCHAR2(200);
        FILE_CODE  VARCHAR2(100) :='BOM'||TO_CHAR(SYSDATE,'HHMISS');
        p_file_path varchar2(200);
  ln_count number;

BEGIN
        FILE_NAME := '/prod/applprod/prodora/iAS/Apache/Apache/htdocs/lc_cust/'||FILE_CODE||'.xls';
        FILE_ID := TEXT_IO.FOPEN(FILE_NAME, 'w');

  TEXT_IO.PUT(FILE_ID,convert('父項料號','ZHT16BIG5','UTF8'));
  Text_IO.PUT(FILE_ID,chr(9));  
  TEXT_IO.PUT(FILE_ID,convert('子項料號','ZHT16BIG5','UTF8'));
  Text_IO.PUT(FILE_ID,chr(9));  
  TEXT_IO.PUT(FILE_ID,convert('子項料名','ZHT16BIG5','UTF8'));
  Text_IO.PUT(FILE_ID,chr(9));
  TEXT_IO.PUT(FILE_ID,convert('單位','ZHT16BIG5','UTF8'));
  Text_IO.PUT(FILE_ID,chr(9));
        TEXT_IO.PUT(FILE_ID,convert('單位用量','ZHT16BIG5','UTF8'));
        Text_IO.PUT(FILE_ID,chr(9));
        TEXT_IO.PUT(FILE_ID,convert('利用率','ZHT16BIG5','UTF8'));
        Text_IO.PUT(FILE_ID,chr(9));
        TEXT_IO.PUT(FILE_ID,convert('供給型態','ZHT16BIG5','UTF8'));
        Text_IO.PUT(FILE_ID,chr(9));
        TEXT_IO.PUT(FILE_ID,convert('供給倉庫','ZHT16BIG5','UTF8'));
        Text_IO.PUT(FILE_ID,chr(9));
        TEXT_IO.PUT(FILE_ID,convert('供給儲位','ZHT16BIG5','UTF8'));
        Text_IO.PUT(FILE_ID,chr(9));
        TEXT_IO.PUT(FILE_ID,convert('分類','ZHT16BIG5','UTF8'));        


       


        GO_BLOCK('CHECK_BOM_COMPONENT_PT');
        FIRST_RECORD;

  LOOP
        Text_IO.PUT(FILE_ID,chr(13));
        Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.ASSEMBLY_SEGMENT,' '),'ZHT16BIG5','UTF8'));
                 Text_IO.PUT(FILE_ID,chr(9));
                 Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.COMPONENT_SEGMENT,' '),'ZHT16BIG5','UTF8'));
                 Text_IO.PUT(FILE_ID,chr(9));
                 Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.COMPONENT_DESCRIPTION,' '),'ZHT16BIG5','UTF8'));
                 Text_IO.PUT(FILE_ID,chr(9));
                 Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.PRIMARY_UOM_CODE,' '),'ZHT16BIG5','UTF8'));
                 Text_IO.PUT(FILE_ID,chr(9));
                 Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.COMPONENT_QUANTITY,0),'ZHT16BIG5','UTF8'));
                 Text_IO.PUT(FILE_ID,chr(9));
                 Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.COMPONENT_YIELD_FACTOR,''),'ZHT16BIG5','UTF8'));
                 Text_IO.PUT(FILE_ID,chr(9));
                 Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.MEANING,''),'ZHT16BIG5','UTF8'));
                 Text_IO.PUT(FILE_ID,chr(9));
                 Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.SUBINVENTORY_CODE,''),'ZHT16BIG5','UTF8'));
                 Text_IO.PUT(FILE_ID,chr(9));
                 Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.INVENTORY_LOCATOR_SEGMENT,''),'ZHT16BIG5','UTF8'));
                 Text_IO.PUT(FILE_ID,chr(9));
                 Text_IO.PUT(FILE_ID,convert(NVL(:CHECK_BOM_COMPONENT_PT.CATEGORY_SEGMENT,''),'ZHT16BIG5','UTF8'));                                         
                
                 NEXT_RECORD;
        EXIT WHEN :SYSTEM.CURRENT_VALUE IS NULL;
  END LOOP;

  TEXT_IO.FCLOSE(FILE_ID);
  p_file_path :='http://erp.lacquercraft.com:8000/lc_cust/'||FILE_CODE||'.xls';
  Web.Show_Document(p_file_path, '_BLANK');
END;

20111213

 

 

if l_attachtype = 'XLS' then
      l_mimetype := 'application/vnd.ms-excel';
  end if;
  if l_attachtype = 'DOC' then
      l_mimetype := 'application/vnd.ms-word';
  end if;
  if l_attachtype = 'PDF' then
      l_mimetype := 'application/pdf';
  end if;
  if l_attachtype in ('HTML','HTM') then
      l_mimetype := 'text/html';
  end if;

用Python将mysql数据导出成excel

1、导出示例 /Users/nisj/PycharmProjects/BiDataProc/oldPythonBak/mysqlData2excel.py # -*- coding=utf-8 -...
  • BabyFish13
  • BabyFish13
  • 2017年07月07日 15:25
  • 407

通过python将MySQL,Oracle查询的数据存到Excel文件

#!/usr/bin/python # -*- coding: UTF-8 -*- #---------------------------------------------------------...
  • wuxbeyond
  • wuxbeyond
  • 2016年02月23日 14:34
  • 1910

用python写wps的excel文件

参考了网上的一些帖子,试了一下用python写wps的excel文件(需要windows操作系统,安装了wps的表格处理程序,安装了pywin32)——我安装的是WPS个人版,可以免费使用的。  im...
  • huzhenwei
  • huzhenwei
  • 2009年09月20日 23:01
  • 4003

python通过xlwt模块直接在网页上生成excel文件并下载

转载自:http://www.sharejs.com/codes/python/7265 import xlwt import StringIO import web urls = ( '/rim...
  • feigamesnb
  • feigamesnb
  • 2015年12月31日 15:02
  • 833

Python 对Oracle的操作

简单的封装 def Oracle_Exec(SqlStr): "Execute oracle command" conn = cx_Oracle.connect(DB_UserNam...
  • swiftshow
  • swiftshow
  • 2012年03月22日 15:40
  • 957

Python-Excel+Oracle

import xlrd import cx_Oracle """ all indexs's number in excel begin with 0 """ __excel = xlrd.open...
  • kingston001
  • kingston001
  • 2014年07月28日 17:19
  • 979

Python实战之Oracle数据库操作

本文地址:http://blog.csdn.net/kongxx/article/details/7107661 1. 要想使Python可以操作Oracle数据库,首先需要安装cx_Oracle包...
  • kongxx
  • kongxx
  • 2011年12月28日 08:31
  • 63246

【python】 python 查询oracle数据生成excel

接上篇安装好了cx_Oracle.msi  MySql.msi 下载安装 xlwt-0.7.5.tar.gz, 到安装目录下 命令窗口cmd下执行 python setup.py install即可 ...
  • payton_liu
  • payton_liu
  • 2015年03月26日 21:34
  • 1858

Python 2.x 将mysql查询结果写入excel并打包成zip

需求背景每日导出一份会员信息,并以excel形式发送给相关人员,考虑到数据的量,进行了压缩处理 脚本内容#!/usr/bin/env python #-*- coding: utf8 -*-impor...
  • Chuck_Perry
  • Chuck_Perry
  • 2017年02月10日 16:03
  • 560

使用Python一键生成Oracle性能excel曲线图

  • 2015年12月24日 20:11
  • 726KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:将oracle数据库中数据写入excel文件
举报原因:
原因补充:

(最多只允许输入30个字)