前言:
因为总所周知的原因,在苹果的地盘使用微软的东西总会很不顺畅,作为电子表格软件,Excel在普及性上完胜苹果Numbers,所以一些商用软件有导出为Excel格式的要求就很正常了,但是使用起来会有很多坑。以下逐步总结起来:
1、配置XlsxReaderWriter到项目
这方面网上有现成的例子,照做就是:
Objective-C项目:https://github.com/renebigot/XlsxReaderWriter
Swift项目:https://github.com/joelparkerhenderson/demo_swift_excel_xlsx_reader_writer
简而言之,就是把现成的XlsxReaderWriter作为一个项目导入到你需要使用的项目中。
2、怎么创建Excel
目前没有办法直接凭空生成一个Excel文件,但有一个曲线救国的办法,在项目中导入一个xlsx模板,然后通过读取这个预先存在于main-bundle路径下的文件,在user的documents文件夹下另存为一个,代码如下(swift代码,下同):
// 模板地址
let templatePath: String = Bundle.main.path(forResource: "template", ofType: "xlsx")!
// document目录
let documentPath: String = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last!
print("------ WORKING DIRECTORY : \(documentPath)")
// 读取并修改模板文件
let spreadsheet: BRAOfficeDocumentPackage = BRAOfficeDocumentPackage.open(templatePath)
let sheet: BRASheet = spreadsheet.workbook.sheets[0] as! BRASheet
let worksheet: BRAWorksheet = spreadsheet.workbook.worksheets[0] as! BRAWorksheet
//TODO: 可以对读取的模板文件做任意修改
// 另存为documents下的文件
let fileName: String = "demo".appending(".xlsx")
let filePath: String = documentPath.appending("/\(fileName)")
spreadsheet.save(as: filePath)
可以通过log输出的WORKING DIRECTORY 在模拟器中打开路径,查看另存为的xlsx文件是否按照预期修改
3 怎么合并单元格
// CellA:CellB合并
let beginA = "A1"
let endB = "B1"
let mergeAtoB: BRAMergeCell = BRAMergeCell.init(rangeReference: "\(beginA):\(endB)")
worksheet.mergeCells.add(mergeAtoB)
当然也可跨行合并,只需拼接起始单元格和结束单元格的引用字符串,并中间加入:就可以了
如 "A1:H28"
// 引用合并的单元格搞事情
let itemCell: BRACell = worksheet.cellOrFirstCellInMergeCell(forCellReference: beginA)
itemCell.setStringValue("demo")
4 怎么调整行高
let rowIndex: Int = 0 // 行索引
let aRow: BRARow = worksheet.rows.object(at: rowIndex) as! BRARow // 获取行
aRow.hasCustomHeight = true // 自定义高度
aRow.height = 30 // 新高度
5 怎样获取每列的宽度
let columnIds: [String] = ["C1", "D1", "E1", "F1"]
for index in 0..<columnIds.count {
let cell: BRACell = worksheet.cell(forCellReference: columnIds[index])
let column: BRAColumn = worksheet.columns.object(at: cell.columnIndex()) as! BRAColumn
print(column.pointWidth) // 每列宽 单位像素
}
6 怎么插入图片
这里有一个坑,就是模板文件必须有一个已经存在的图片作为占位图片(不论大小),否则不论怎么写代码都不会插入成功
支持png和JPEG格式的图片
let insertBeginIndex = 2 // 插入行索引
let rowCount: Int = 10 // 图像所跨行数
let beginIdentifer = "A\(insertBeginIndex)"
let endIdentifer = "I\(insertBeginIndex+rowCount)"
let imageFileName = "demo.png"
let imagePath = documentPath.appending("/\(imageFileName)")
if let image = UIImage.init(contentsOfFile: imagePath) {
let drawing: BRAWorksheetDrawing = worksheet.add(image, betweenCellsReferenced: beginIdentifer, and: endIdentifer, with: UIEdgeInsets.zero, preserveTransparency: true) // preserveTransparency参数:png是true,jpeg是false
drawing.shouldKeepAspectRatio = true // 保持长宽比
}
7 xlsx文件的mime类型:
"application/vnd.ms-excel"
暂时就这么多,以后有新的功能需求实现再补充~
网友评论