odoo导出excel表格
tree上导入表格
添加按钮
在static/src中编写xml模板
<templates id="bicon_base_goods_button" xml:space="preserve"> <t t-extend="ListView.buttons"> <t t-jquery="div.o_list_buttons" t-operation="append"> <t t-if="widget.displayName=='商品'"> <button class="btn btn-primary bicon_base_goods_button" type="button" groups="sys_manager.YHY_group">导出excel</button> </t> </t> </t> </templates>
在static/src中编写js文件
odoo.define(‘bicon_store.bicon_base_goods_button’, function (require) {
“use strict”;
//这些是调⽤需要的模块
var ListView = require(‘web.ListView’);
var viewRegistry = require(‘web.view_registry’);
var ListController = require(‘web.ListController’);
var dialogs = require(“web.Dialog”);
//这块代码是继承ListController在原来的基础上进⾏扩展
var BiConListController = ListController.extend({
renderButtons: function () {
this._super.apply(this, arguments);
if (this.KaTeX parse error: Expected '}', got 'EOF' at end of input: …var btn = this.buttons.find(’.bicon_base_goods_button’);
//给按钮绑定click事件和⽅法create_data_by_dept
btn.on(‘click’, this.proxy(‘create_data_by_dept’));
}
},
create_data_by_dept: function () {
var self = this;
//这⾥是获取tree视图中选中的数据的记录集
var records = _.map(self.selectedRecords, function (id) {
return self.model.localData[id];
});
console.log(“数据id:” + _.pluck(records, ‘res_id’));
//获取到数据集中每条数据的对应数据库id集合
var ids = _.pluck(records, ‘res_id’);
if(ids.length==0){
new dialogs.alert(this, ‘请选择需要导出的数据.’);
return
}
//通过rpc调⽤路由为/cloud/bicon_base_goods_button的controller中的⽅法
var url = ‘/cloud/bicon_base_goods_button?ids=’+ids;
var xhr = new XMLHttpRequest();
xhr.open(‘POST’, url, true); // 也可以使用POST方式,根据接口
xhr.responseType = “blob”; // 返回类型blob
// 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
xhr.onload = function () {
// 请求完成
if (this.status === 200) {
// 返回200
var blob = this.response;
var reader = new FileReader();
reader.readAsDataURL(blob); // 转换为base64,可以直接放入a表情href
reader.onload = function (e) {
// 转换完成,创建一个a标签用于下载
var a = document.createElement(‘a’);
a.download = ‘商品信息.xls’;
a.href = e.target.result;
$(“body”).append(a); // 修复firefox中无法触发click
a.click();
$(a).remove();
}
}
};
// 发送ajax请求
xhr.send()
},
});
//这块代码是继承ListView在原来的基础上进⾏扩展
//这块⼀般只需要在config中添加上⾃⼰的Model,Renderer,Controller
// 这⾥我就对原来的Controller进⾏了扩展编写,所以就配置了⼀下BiConListController
var BiConListView = ListView.extend({
config: _.extend({}, ListView.prototype.config, {
Controller: BiConListController,
}),
});
//这⾥⽤来注册编写的视图BiConListView,第⼀个字符串是注册名到时候需要根据注册名调⽤视图
viewRegistry.add(‘bicon_base_goods_button’, BiConListView);
return BiConListView;
});
在__manifest__.py中导入xml
### 在views中创建assets.xml, 并引入js
### 在xml中的tree上加上按钮id
至此为止按钮添加成功
Controller
import logging
import xlwt
from io import *
from odoo import tools, http
from odoo.http import request, Controller, route, content_disposition
_logger = logging.getLogger(name)
class kucun_excel(Controller):
# //导出采购信息
@http.route([’/cloud/bicon_purchase_order_button’], type=‘http’, auth=“public”, website=True, csrf=False)
def bicon_purchase_order_button_down_excel(self, ids, **post):
ids_arr = ids.split(’,’)
ids_arr = list(map(int, ids_arr))
workbook = xlwt.Workbook()
worksheet = workbook.add_sheet(u’采购信息’,cell_overwrite_ok=True)
# 定义每一列的宽度
worksheet.col(0).width = 256 * 24
worksheet.col(1).width = 256 * 20
worksheet.col(2).width = 256 * 14
worksheet.col(3).width = 256 * 15
worksheet.col(4).width = 256 * 12
worksheet.col(5).width = 256 * 14
worksheet.col(6).width = 256 * 22
worksheet.col(7).width = 256 * 16
worksheet.col(8).width = 256 * 13
worksheet.col(9).width = 256 * 16
worksheet.col(10).width = 256 * 15
worksheet.col(11).width = 256 * 13
worksheet.col(12).width = 256 * 16
worksheet.col(13).width = 256 * 15
worksheet.col(14).width = 256 * 12
worksheet.col(15).width = 256 * 14
worksheet.col(16).width = 256 * 22
worksheet.col(17).width = 256 * 22
worksheet.col(18).width = 256 * 22
# 创建style对象
style = xlwt.XFStyle()
# 创建alignment对象
alignment = xlwt.Alignment()
# 指定水平居中 HORZ_CENTER = 0x02 左端对齐
alignment.horz = xlwt.Alignment.HORZ_LEFT
alignment.vert = xlwt.Alignment.VERT_CENTER
# 指定对齐格式
style.alignment = alignment
row = 0
worksheet.write(0, 0, u’采购单号’,style)
worksheet.write(0, 1, u’供应商名称’,style)
worksheet.write(0, 2, u’采购人’,style)
worksheet.write(0, 3, u’业务总额’,style)
worksheet.write(0, 4, u’进价总额’,style)
worksheet.write(0, 5, u’备注’,style)
worksheet.write(0, 6, u’单据编号’,style)
worksheet.write(0, 7, u’单据状态’,style)
worksheet.write(0, 8, u’首次审核时间’,style)
worksheet.write(0, 9, u’通用名称’,style)
worksheet.write(0, 10, u’生产厂家’,style)
worksheet.write(0, 11, u’规格’,style)
worksheet.write(0, 12, u’单位’,style)
worksheet.write(0, 13, u’进价’,style)
worksheet.write(0, 14, u’采购数量’,style)
worksheet.write(0, 15, u’进价货总额’,style)
worksheet.write(0, 16, u’最后进价’,style)
worksheet.write(0, 17, u’是否拆零’,style)
worksheet.write(0, 18, u’细单状态’,style)
partners = request.env[‘bicon_purchase_order’].search([(‘id’, ‘in’, ids_arr)])
for partner in partners:
orderdtllines = partner.orderdtlline
worksheet.write_merge(row+1, row+len(orderdtllines), 0, 0, partner.ordernumber, style=style)
supplyer = request.env[‘bicon.bs.supplyer’].search([(“id”, “=”, partner.supplyerid.id)])
worksheet.write_merge(row+1, row+len(orderdtllines), 1, 1, supplyer.supplyer_name, style=style)
create_uid = request.env[‘sys.pubuser’].search([(“id”, “=”, partner.create_uid.id)])
worksheet.write_merge(row+1, row+len(orderdtllines), 2, 2, create_uid.staff_name, style)
worksheet.write_merge(row + 1, row + len(orderdtllines), 3, 3, partner.bu_money, style=style)
worksheet.write_merge(row + 1, row + len(orderdtllines), 4, 4, partner.l_money, style=style)
worksheet.write_merge(row + 1, row + len(orderdtllines), 5, 5, partner.memo, style=style)
worksheet.write_merge(row + 1, row + len(orderdtllines), 6, 6, partner.order_no, style=style)
if partner.jobstatus == “1”:
worksheet.write_merge(row + 1, row + len(orderdtllines), 7, 7, ‘已审核’, style)
elif partner.jobstatus == “2”:
worksheet.write_merge(row + 1, row + len(orderdtllines), 7, 7, ‘待审核’, style)
worksheet.write_merge(row + 1, row + len(orderdtllines), 8, 8, partner.apraludate, style)
for orderdtlline in orderdtllines:
row += 1
worksheet.write(row, 0, partner.ordernumber, style)
supplyer = request.env[‘bicon.bs.supplyer’].search([(“id”, “=”, partner.supplyerid.id)])
worksheet.write(row, 1, supplyer.supplyer_name, style)
create_uid = request.env[‘sys.pubuser’].search([(“id”, “=”, partner.create_uid.id)])
worksheet.write(row, 2, create_uid.staff_name, style)
worksheet.write(row, 3, partner.bu_money, style)
worksheet.write(row, 4, partner.l_money, style)
worksheet.write(row, 5, partner.memo, style)
worksheet.write(row, 6, partner.order_no, style)
if partner.jobstatus == “1”:
worksheet.write(row, 7, ‘已审核’, style)
elif partner.jobstatus == “2”:
worksheet.write(row, 7, ‘待审核’, style)
worksheet.write(row, 8, partner.apraludate, style)
goods = request.env[‘bicon.bs.goods’].search([(“id”, “=”, orderdtlline.goodsid.id)])
worksheet.write(row, 9, goods.goodsname, style)
worksheet.write(row, 10, orderdtlline.producer, style)
worksheet.write(row, 11, orderdtlline.goodsspetype, style)
ddlid = request.env[‘sys.column.ddl’].search([(‘keyword’, ‘=’, ‘package_unit’)]).id
ddl_dtl = request.env[‘sys.column.ddl.dtl’].search(
[(‘key’, ‘=’, orderdtlline.package_unit), (‘ddlid’, ‘=’, ddlid)])
worksheet.write(row, 12, ddl_dtl[‘value’], style)
worksheet.write(row, 13, orderdtlline.unitprice, style)
worksheet.write(row, 14, orderdtlline.goodsqty, style)
worksheet.write(row, 15, orderdtlline.l_money, style)
worksheet.write(row, 16, orderdtlline.lastprice, style)
if orderdtlline.scattered_trade:
worksheet.write(row, 17, ‘√’, style)
elif not orderdtlline.scattered_trade:
worksheet.write(row, 17, ‘×’, style)
if partner.jobstatus == “1”:
worksheet.write(row, 18, ‘已审核’, style)
elif partner.jobstatus == “2”:
worksheet.write(row, 18, ‘待审核’, style)
fp = BytesIO()
workbook.save(fp)
fp.seek(0)
data = fp.read()
fp.close()
return request.make_response(data, [(‘Content-Type’, ‘application/octet-stream’),
(‘Content-Disposition’, content_disposition(u’采购信息.xls’))])