繁体   English   中英

试图提交 html 表单数据到 excel

[英]Trying to submit html form data to excel

我成功编写代码以将 html 表单数据作为单个 excel 行提交。 但是在我的 html 表单中,我想提交多个数据,这些数据应该附加在 excel 的单个单元格中,但数据的第二部分应该以同一单元格中的新行开头。 就像(ALT + Enter 操作)。 我的 html 代码如下。

索引.html

{{template "header"}}
<form method="POST">
    <label for="name">NAME</label>
    <input type="text" id="name" name="name">
    <br style="mso-data-placement:same-cell;">
    <label for="gender">GENDER</label>
    <input type="text" id="gender" name="gender">
    <br>
    <label for="age">AGE</label>
    <input type="text" id="age" name="age">
    <br>
  <input type="submit">
</form>
<br>

我尝试使用“style="mso-data-placement:same-cell;" 但它无济于事。

我的golang代码如下。

func datasubmit(w http.ResponseWriter, req *http.Request) {
      nm := req.FormValue("name")
      ge := req.FormValue("gender")
      ag := req.FormValue("age")
      var data = M{"Name": nm, "GENDER": ge, "AGE": ag}  // i have used map type M map[string]interface{}
      tpl.ExecuteTemplate(w, "index.gohtml", data)
      f, err := excelize.OpenFile("./Book99.xlsx")
          if err != nil {
          fmt.Println(err)
          return
         }
      sheetName := f.GetSheetName(0)
      fmt.Println(sheetName)
      rows, err := f.GetRows(sheetName)
      rlast := len(rows)
      fmt.Println(rows)
      fmt.Println(rlast)
      f.SetCellValue(sheetName, fmt.Sprintf("A%d", rlast+1), data["Name"])
      f.SetCellValue(sheetName, fmt.Sprintf("B%d", rlast+1), data["GENDER"])
      f.SetCellValue(sheetName, fmt.Sprintf("C%d", rlast+1), data["AGE"])
      err = f.SaveAs("./Book99.xlsx")
       if err != nil {
        fmt.Println(err)
       }
}

你能指导我用多个数据从新行开始打破第一个单元格吗? ex jim;jam ==> jim jam 都在单个单元格中,但在 excel 中与新行卡住。

如果我正确阅读了您的查询,我相信您在问如何将新的文本行添加到 excel 单元格中(您可以在 Excel 应用程序中使用 ALT+Enter 来执行此操作)。 数据的来源似乎与您的问题无关。

在 Excel(在 Windows 上)中,一个单元格中的多行由换行符(char 0xA 或\n in go)分割。 但是,当您添加换行符时,Excel 会自动将单元格设置为“换行”(如果您不这样做,则换行符存在但不显示),这有一点复杂。

这是如何在 Go 中实现的示例; 每次运行应用程序时,它都会在单元格 A1 中添加一个新行。 请注意,我没有更改单元格高度,因此您需要这样做以使额外的行可见:

func main() {
    f, err := excelize.OpenFile("./Book99.xlsx")
    if err != nil {
        panic(err)
    }
    sheetName := f.GetSheetName(0)

    // Set cell A1 to Wrap
    style, err := f.NewStyle(&excelize.Style{
        Alignment: &excelize.Alignment{
            WrapText: true,
        },
    })
    if err != nil {
        panic(err)
    }
    if err := f.SetCellStyle("Sheet1", "A1", "A1", style); err != nil {
        panic(err)
    }

    // Get cell value, add new name and save
    v, err := f.GetCellValue(sheetName, "a1")
    if err != nil {
        panic(err)
    }
    fmt.Printf("%x\n", v) // Output as hex so you can see how the line break is encoded
    err = f.SetCellValue(sheetName, "a1", v + "\n" + "Joe Bloggs")
    if err != nil {
        panic(err)
    }
    err = f.SaveAs("./Book99.xlsx")
    if err != nil {
        panic(err)
    }
}

感谢您的反馈和时间来解决我的问题。

最后,我在下面的代码的帮助下实现了我的目标。 它有点复杂,但它对我有用,我希望它对其他人也有帮助。


func datasubmit(w http.ResponseWriter, req *http.Request) {
    nm := req.FormValue("name")
    ge := req.FormValue("gender")
    ag := req.FormValue("age")

    sliNm := strings.Split(nm, ";") // creating slice if ";" occur then it treat as another element of slice

    var final string // again creating string to fill "\n"
    for _, v := range sliNm {
        final += v
        final = final + "\n"
    }

    fmt.Println(final)

    var data = M{"Name": final, "GENDER": ge, "AGE": ag} // data as map
    tpl.ExecuteTemplate(w, "index.gohtml", data)

    f, err := excelize.OpenFile("./Book99.xlsx")
    if err != nil {
        fmt.Println(err)
        return
    }

    sheetName := f.GetSheetName(0)
    
    // Set cell A1 to Wrapp
    style, err := f.NewStyle(&excelize.Style{
        Alignment: &excelize.Alignment{
            WrapText: true,
        },
    })
    if err != nil {
        panic(err)
    }

    fmt.Println(sheetName)
    rows, err := f.GetRows(sheetName)
    rlast := len(rows)
    fmt.Println(rows)
    fmt.Println(rlast)

    f.SetCellStyle(sheetName, fmt.Sprintf("A%d", rlast+1), fmt.Sprintf("A%d", rlast+1), style) // setting cell style for newly creating cell with every iteration
    fmt.Println(data["Name"])
    f.SetCellValue(sheetName, fmt.Sprintf("A%d", rlast+1), data["Name"])
    f.SetCellValue(sheetName, fmt.Sprintf("B%d", rlast+1), data["GENDER"])
    f.SetCellValue(sheetName, fmt.Sprintf("C%d", rlast+1), data["AGE"])

    err = f.SaveAs("./Book99.xlsx")
    if err != nil {
        fmt.Println(err)
    }
}

这段代码对我有用。 假设输入是 jim;jam; ==> 我的 o/p 在 excel 的单个单元格中如下所示。 吉姆果酱

此外,是的,执行模板没有任何意义,但我创建它只是为了查看网站上最近提交的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM