我如何从用 swift 编写的 iOS 中准确导出 csv 文件?

Posted

技术标签:

【中文标题】我如何从用 swift 编写的 iOS 中准确导出 csv 文件?【英文标题】:How do i exactly export a csv file from iOS written in swift? 【发布时间】:2015-09-15 18:54:31 【问题描述】:

我正在尝试导出 cvs 文件。

通过以下代码,我设法获取文件

let fileName = "sample.csv"//"sample.txt"        
    @IBAction func createFile(sender: AnyObject) 
            let path = tmpDir.stringByAppendingPathComponent(fileName)
            let contentsOfFile = "No,President Name,Wikipedia URL,Took office,Left office,Party,Home State\n1,George Washington,http://en.wikipedia.org/wiki/George_Washington,30/04/1789,4/03/1797,Independent,Virginia\n2,John Adams,http://en.wikipedia.org/wiki/John_Adams,4/03/1797,4/03/1801,Federalist,Massachusetts\n3,Thomas Jefferson,http://en.wikipedia.org/wiki/Thomas_Jefferson,4/03/1801,4/03/1809,Democratic-Republican,Virginia\n4,James Madison,http://en.wikipedia.org/wiki/James_Madison,4/03/1809,4/03/1817,Democratic-Republican,Virginia\n5,James Monroe,http://en.wikipedia.org/wiki/James_Monroe,4/03/1817,4/03/1825,Democratic-Republican,Virginia\n6,John Quincy Adams,http://en.wikipedia.org/wiki/John_Quincy_Adams,4/03/1825,4/03/1829,Democratic-Republican/National Republican,Massachusetts"
                //"Sample Text repacement for future cvs data"content to save

            // Write File

            do 
                try contentsOfFile.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding)
                print("File sample.txt created at tmp directory")
             catch 

                print("Failed to create file")
                print("\(error)")
            

        

// Share button
    @IBAction func shareDoc(sender: AnyObject) 
        print("test share file")

         docController.UTI = "public.comma-separated-values-text"
            docController.delegate = self//delegate
            docController.name = "Export Data"
            docController.presentOptionsMenuFromBarButtonItem(sender as! UIBarButtonItem, animated: true)

        //
    

当我单击模拟器中的共享文件按钮时,我看到以下内容:

快速查看它会显示

所以我接下来做的是用我的 iphone 5 进行测试,我尝试通过电子邮件发送 sample.csv 但我只收到消息正文而不是 csv 文件???

    我怎样才能真正通过电子邮件发送 .csv 文件? 有哪些出口可能性?

【问题讨论】:

【参考方案1】:

要通过电子邮件发送 .csv 文件,您可以执行以下操作:

    将此导入添加到类的顶部。它允许您使用 MFMailComposeViewController,这是一种发送电子邮件的方式。

    import MessageUI
    

    生成你的数据,我做过的一个例子是:

    // Creating a string.
    var mailString = NSMutableString()
    mailString.appendString("Column A, Column B\n")
    mailString.appendString("Row 1 Column A, Row 1 Column B\n")
    mailString.appendString("Row 2 Column A, Row 2 Column B\n")
    
    // Converting it to NSData.
    let data = mailString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
    
    // Unwrapping the optional.
    if let content = data            
        print("NSData: \(content)")
    
    

    生成 MFMailComposeViewController

    // Generating the email controller.
        func configuredMailComposeViewController() -> MFMailComposeViewController 
            let emailController = MFMailComposeViewController()
            emailController.mailComposeDelegate = self
            emailController.setSubject("CSV File")
            emailController.setMessageBody("", ishtml: false)
    
            // Attaching the .CSV file to the email.
            emailController.addAttachmentData(data!, mimeType: "text/csv", fileName: "Sample.csv")
    
            return emailController
        
    
    // If the view controller can send the email.
    // This will show an email-style popup that allows you to enter
    // Who to send the email to, the subject, the cc's and the message.
    // As the .CSV is already attached, you can simply add an email 
    // and press send.
        let emailViewController = configuredMailComposeViewController()
        if MFMailComposeViewController.canSendMail() 
            self.presentViewController(emailViewController, animated: true, completion: nil)
        
    

在您的情况下,由于您已经创建了文件,您可以通过更改将 CSV 附加到邮件的行来直接附加该文件:

    emailController.addAttachmentData(NSData(contentsOfFile: "YourFile")!, mimeType: "text/csv", fileName: "Sample.csv")

答案基于:Attach csv to email xcode, Create CSV file in Swift and write to file

【讨论】:

【参考方案2】:

在 Swift 中创建 CSV 文件

class ViewController: UIViewController 

var taskArr = [Task]()
var task: Task!

override func viewDidLoad() 
    super.viewDidLoad()
    task = Task()
    for _ in 0..<5 
        task.name = "Raj"
        task.date = "\(Date())"
        task.startTime = "Start \(Date())"
        task.endTime = "End \(Date())"
        taskArr.append(task!)
    

    creatCSV()


// MARK: CSV file creating
    func creatCSV() -> Void 
        let fileName = "Tasks.csv"
        let path = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(fileName)
        var csvText = "Date,Task Name,Time Started,Time Ended\n"

        for task in taskArr 
            let newLine = "\(task.date),\(task.name),\(task.startTime),\(task.endTime)\n"
            csvText.append(newLine)
        

        do 
            try csvText.write(to: path!, atomically: true, encoding: String.Encoding.utf8)
         catch 
            print("Failed to create file")
            print("\(error)")
        
        print(path ?? "not found")
    

任务模型类

class Task: NSObject 
    var date: String = ""
    var name: String = ""
    var startTime: String = ""
    var endTime: String = ""

CSV 输出显示如下格式

【讨论】:

可以设置文字居中对齐吗? 我没有找到任何关于 csv 文件文本对齐的解决方案。 我们如何在 swift 4 中做到这一点? 你好@Antony,这段代码也适用于Swift 4 但是 WhatsApp 抛出无法共享该项目的消息选择不同的项目【参考方案3】:

SWIFT 5

func creatCSV() 
    let fileName = "exportar_serv.csv"

    /* CREAR UN ARCHIVO NUEVO EN EL DIRECTORIO PRINCIPAL */
    guard let path = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent(fileName) as NSURL else 
        return 

    var csvText = "id,name,imageName\n"

    for task in taskArr 
        let x : Int64 = task.id!
        let id2 = String(x)

        let newLine = "\(id2),\(task.name),\(task.imageName)\n"
        csvText.append(newLine)
     // for

    do 
        try csvText.write(to: path as URL, atomically: true, encoding: String.Encoding.utf8)
        print("DATOS GUARDADOS")
     catch 
        print("Failed to create file")
        print("\(error)")
     // catch

 // CreateCSV

【讨论】:

【参考方案4】:

Swift 5.0.1、Xcode 10.2.1 版本

    private func injectExportButton() 
    var csvIcon: UIImage
    switch self.theme 
    case .dark:
        csvIcon = UIImage(named: "csv-export.dark", in: Bundle.framework)!
    case .light:
        csvIcon = UIImage(named: "csv-export.light", in: Bundle.framework)!
    
            let imgWidth = csvIcon.size.width
            let imgHeight = csvIcon.size.height
            let button: UIButton = UIButton(frame: CGRect(x: 0, y: 0, width: imgWidth, height: imgHeight))
            button.setBackgroundImage(csvIcon, for: UIControl.State())
            button.alpha = 0
    button.addTarget(self, action: #selector(csvExportButtonClicked), for: .touchUpInside)
            UIView.animate(withDuration: 0.5) 
                button.alpha = 1
            
            navigationItem.rightBarButtonItem = UIBarButtonItem(customView: button)



@objc private func csvExportButtonClicked() 
    debugPrint("export clicked")
    createCSV()


private func createCSV() -> Void 
    let fileName = getDocumentsDirectory().appendingPathComponent("OutputD.csv")
    var csvOutputText = "Result, Date, Name\n"
    history.results.forEach  result in
        let newLine = "\(String(describing: result.value)),\(String(describing: result.date)),\(String(describing: result.name))\n"
        csvOutputText.append(newLine)
    
    do 
        try csvOutputText.write(to: fileName, atomically: true, encoding: String.Encoding.utf8)
     catch 
        print("Failed to create file")
        print("\(error)")
    
    let activity = UIActivityViewController(activityItems: ["your results", fileName], applicationActivities: nil)
    present(activity, animated: true)


private func getDocumentsDirectory() -> URL 
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    return paths[0]

【讨论】:

更改字符串数组的 history.results。然后只需在需要时放置 injectExportButton() 即可 - 该按钮将在任何导航控制器上“开箱即用”工作

以上是关于我如何从用 swift 编写的 iOS 中准确导出 csv 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从用 Swift 编写的 Flutter 平台特定代码启动 ViewController?

如何从用 C# 编写的抽象基类继承

我应该如何从用 PHP 编写的 RESTful api 提供二进制文件(图像/音频)?

如何在 iOS、PDFKit、swift 中获取 pdf 页面的准确 X 和 Y 原点值

如何从用java编写的查询中将虚线字符串传递给oracle

如何从用 asp.net 中的 scriptmanager.registerclientscript 编写的 javascript 确认框返回值?