goalng导出excel(csv格式)

最近项目中有个小需求,需要将查询结果导出到excel。之间前java比较容易,使用POI很容易就能实现,查了下golang的文档,发现golang下边并没有导出excel的包,但是却有一个encoding/csv的包,看了下发现可以导出csv文件,大家都知道csv文件其实就是文本格式的excel文件,可以直接通过excel打开或是导入excel。

看起来挺好的,问题如愿解决,但是事实证明对已一个还不成熟的语言或是库最好还是先测一下的好。兴冲冲的卸了测试例子,成功导出了一个text.csv文件,一切看起来都挺好的,然而打开之后就傻眼了:中文乱码,这个问题其实比较好理解,golang只支持utf-8,而win中文版默认字符集是GB2312(gbk),这样看来直接转码就行了呗。
    由于之前吃了亏,这次我们先直接报文件转下码试试:直接将之前导出的text.csv另存为ASCII格式,打开后发现回车换行符丢了,全部变成一行了。这下就郁闷了,先看下源码吧:

// Writer writes a single CSV record to w along with any necessary quoting.
// A record is a slice of strings with each string being one field.
func (w *Writer) Write(record []string) (err error) {
        for n, field := range record {
                if n > 0 {
                        if _, err = w.w.WriteRune(w.Comma); err != nil {
                                return
                        }
                }

                // If we don‘t have to have a quoted field then just
                // write out the field and continue to the next field.
                if !w.fieldNeedsQuotes(field) {
                        if _, err = w.w.WriteString(field); err != nil {
                                return
                        }
                        continue
                }
                if err = w.w.WriteByte(‘"‘); err != nil {
                        return
                }

                for _, r1 := range field {
                        switch r1 {
                        case ‘"‘:
                                _, err = w.w.WriteString(`""`)
                        case ‘\r‘:
                                if !w.UseCRLF {
                                        err = w.w.WriteByte(‘\r‘)
                                }
                        case ‘\n‘:
                                if w.UseCRLF {
                                        _, err = w.w.WriteString("\r\n")
                                } else {
                                        err = w.w.WriteByte(‘\n‘)
                                }
                        default:
                                _, err = w.w.WriteRune(r1)
                        }
                        if err != nil {
                                return
                        }
                }

                if err = w.w.WriteByte(‘"‘); err != nil {
                        return
                }
        }
        if w.UseCRLF {
                _, err = w.w.WriteString("\r\n")
        } else {
                err = w.w.WriteByte(‘\n‘)
        }
        return
}

可以看到代码十分简单,每行就是按照csv的格式写入文件而已。需要注意的是writer里边有一个UserCRLF来指定是否适应回车换行符,默认为false,问题应该就出在这里,但是将
UserCRLF设置为true之后,问题依旧
,看来是转码有问题。

既然代码这么简单,那么还不如直接自己实现,然后转码输出,这里使用
iconv-go
进行转码,实现如下:

package components

import (
	"bytes"
	"errors"
	iconv "github.com/djimenez/iconv-go"
)

/**
 * 导出处理
 */

const (
	OUT_ENCODING = "gbk" //输出编码
)

/**
 * 导出csv格式文件,输出byte数组
 * 输出编码通过OUT_ENCODING指定
 */
func ExportCsv(head []string, data [][]string) (out []byte, err error) {
	if len(head) == 0 {
		err = errors.New("ExportCsv Head is nil")
		return
	}

	columnCount := len(head)
	dataStr := bytes.NewBufferString("")
	//添加头
	for index, headElem := range head {
		separate := ","
		if index == columnCount-1 {
			separate = "\n"
		}
		dataStr.WriteString(headElem + separate)
	}

	//添加数据行
	for _, dataArray := range data {
		if len(dataArray) != columnCount { //数据项数小于列数
			err = errors.New("ExportCsv data format is error.")
		}
		for index, dataElem := range dataArray {
			separate := ","
			if index == columnCount-1 {
				separate = "\n"
			}
			dataStr.WriteString(dataElem + separate)
		}
	}

	//处理编码
	out = make([]byte, len(dataStr.Bytes()))
	iconv.Convert(dataStr.Bytes(), out, "utf-8", OUT_ENCODING)
	return
}

测试一下,导出成功,而且没有乱码问题。

对于目前这个项目而言,导出简单格式的csv就能满足,但是如果想导出复杂的excel文件就不行了。考虑了下大概想出了以下几种方法:

  • 使用cgo,用c来实现导出,这是golang处理类似问题的一贯作风,然而就导出excel而言并不太好,因为c导出复杂格式的excel本身就挺麻烦的
  • 调用其他语言实现的模块,至于怎么调就无所谓,如果对于大批量的导出,其实还挺好的,可以把生成excel这样费时费力的操作给分离出去
  • 按照excel文件格式直接生成为对应二进制文件,这个实现起来可能比较费劲,但是确实一劳永逸的,这里附一个excel格式的链接,有兴趣的可以实现下。

goalng导出excel(csv格式),布布扣,bubuko.com

时间: 2024-10-29 19:12:10

goalng导出excel(csv格式)的相关文章

PHP 高效导入导出Excel(csv)方法之fgetcsv()和fputcsv()函数

CSV,是Comma Separated Value(逗号分隔值)的英文缩写,通常都是纯文本文件. 一.CSV数据导入函数fgetcsv() fgetcsv() 函数从文件指针中读入一行并解析 CSV 字段. 与 fgets() 类似,不同的是 fgetcsv() 解析读入的行并找出 CSV 格式的字段,然后返回一个包含这些字段的数组. fgetcsv() 出错时返回 FALSE,包括碰到文件结束时. 具体使用时封装函数如下: /** * 导入Excel数据表格 * @param string

关于project导出excel的格式问题

1.如出现提示格式问题的时候,这样设置: 在"工具"→"选项"→"安全性"中,在"旧式格式"下选择"允许加载使用旧式文件格式或非默认文件格式的文件(A)"单选框.保存后重复步骤(1),即可导出Excel表. 2.关于project任务层级导出excel的问题 1.制作好Project文件. 2.最前面插入一列:大纲级别. 3.新建Excel文件,Copy Project所有内容到Excel工作表中. 4.在

goalng导出excel(excel格式)

之前写过一篇导出cvs格式的,如果只是简单导出完全能满足需要.按时如果想要有复杂需求,如样式定制.多个sheet之类的,就无法完成了.之后发现有人已经实现golang直接excel对excel的操作,这里分享一下. 地址:https://github.com/tealeg/xlsx 具体各类操作可以直接看里边给出的示例或直接查看代码,用法还是很简单的.这里给出个简单的测试示例: package main import ( "fmt" "github.com/tealeg/xl

MongoDb导出数据.CSV格式到EXCEL

切换到mongodb安装目录,切换到bin目录下 执行以下命令 mongoexport -d myDB -c mycol -f _id,name,password,adress --csv -o ./test.csv -d  表示 数据库 -c   表示 collection -f   需要提取的field用逗号分隔 -o  输出路径

Asp.net导出Excel/Csv文本格式数据

刚刚开始做Excel相关的项目,所以遇到的问题不管大小都给记录一下 偶然的机会在添加数据的时候全改成了数字,结果输出的时候全自动变成了科学计数法,这是excel的强大功能,能自动识别数字和字符串,太聪明了反而有些麻烦,就像如果输入身份证(18位数字)的话那就不行了.超过了11位呢,下面查了些资料总结一下解决方案: 方法1:  在往excel中添加数据的时候在数据的前面加 单引号,我的是这个方法解决的 如:Sheet.Cells[iRow, iCol] ="'"+ ds.Tables[0

EXCEL VBA中写了个宏把本EXCEL中的表数据批量导出为csv格式的文件

Sub csv()    Dim Fs, myFile As Object    Dim myfileline As String 'txtfile的行数据    Dim sht As Worksheet        For Each sht In ThisWorkbook.Sheets        ns = sht.Cells(1, 8)        Set Fs = CreateObject("Scripting.FileSystemObject")   '建立filesyt

c# 导入导出excel表格式

c#使用代码导入excel时,当遇到纯数字且大于15位时会出现编码混乱(表现为科学计数法),要想呈现与excel表中纯数字格式和在数据库中呈现纯数字,操作如下: 完成即可. 导出取决于导入的内容排版.

【MySQL】数据导出成CSV格式

一.自动输出中文字符集 select * from db into outfile 'test.csv' CHARACTER SET gbk fields terminated by ',' optionally enclosed by '"' escaped by '"' lines terminated by '\r\n'; 二.导出后转换字符集 转换成CSV文件,如果乱码将CSV已记事本打开另存为UTF8 select * from db into outfile 'test.c

POI导出excel日期格式

参考帖子: [1]http://www.ithao123.cn/content-2028409.html [2]http://javacrazyer.iteye.com/blog/894850 再读本篇文章之前,请先看我的前一篇文章,前一篇文章中有重点讲到POI设置EXCEL单元格格式为文本格式,剩下的设置小数.百分比.货币.日期.科学计数法和中文大写这些将在下面一一写出 以下将要介绍的每一种都会用到这三行中的变量 HSSFWorkbook demoWorkBook = new HSSFWork